Why are the lines not connecting the dots on my chart?
I know the last array item has no data but I don't think that's the problem.
[1] pry(#<#<Class:0x007fb1936e6828>>)> result
[
[0] {
:name => "Positive Room Pressure",
:data => {
Thu, 12 Jun 2014 16:25:28 UTC +00:00 => true,
Mon, 16 Jun 2014 19:27:21 UTC +00:00 => true,
Tue, 01 Jul 2014 08:58:40 UTC +00:00 => true,
Mon, 07 Jul 2014 19:21:42 UTC +00:00 => true,
Wed, 23 Jul 2014 20:43:23 UTC +00:00 => true,
Wed, 23 Jul 2014 21:05:04 UTC +00:00 => true,
Fri, 25 Jul 2014 05:24:18 UTC +00:00 => false,
Mon, 25 Aug 2014 13:29:40 UTC +00:00 => true
},
:discrete => true
},
[1] {
:name => "Room Humidity",
:data => {
Fri, 16 May 2014 12:13:07 UTC +00:00 => 65.0,
Tue, 10 Jun 2014 19:27:53 UTC +00:00 => 64.0,
Wed, 11 Jun 2014 15:45:17 UTC +00:00 => 65.0,
Thu, 12 Jun 2014 16:25:27 UTC +00:00 => 25.0,
Mon, 16 Jun 2014 19:27:22 UTC +00:00 => 66.0,
Mon, 16 Jun 2014 20:35:34 UTC +00:00 => 97.0,
Tue, 01 Jul 2014 08:58:46 UTC +00:00 => 70.0,
Mon, 07 Jul 2014 19:22:25 UTC +00:00 => 52.0,
Wed, 23 Jul 2014 21:05:18 UTC +00:00 => 65.0,
Mon, 25 Aug 2014 13:29:32 UTC +00:00 => 0.3
},
:discrete => true
},
[2] {
:name => "Ambient Temperature",
:data => {
Fri, 16 May 2014 12:13:10 UTC +00:00 => 33.0,
Tue, 10 Jun 2014 19:28:05 UTC +00:00 => 32.5,
Wed, 11 Jun 2014 15:45:25 UTC +00:00 => 33.0,
Thu, 12 Jun 2014 16:25:40 UTC +00:00 => 34.0,
Mon, 16 Jun 2014 19:27:23 UTC +00:00 => 26.0,
Tue, 01 Jul 2014 08:58:51 UTC +00:00 => 25.0,
Mon, 07 Jul 2014 19:22:33 UTC +00:00 => 34.0,
Wed, 23 Jul 2014 21:05:29 UTC +00:00 => 23.0,
Tue, 12 Aug 2014 22:39:31 UTC +00:00 => 41.0,
Mon, 25 Aug 2014 13:29:31 UTC +00:00 => 23.0
},
:discrete => true
},
[3] {
:name => "smell",
:data => {},
:discrete => true
}
]
![my test chart][1]
[1]: http://i.stack.imgur.com/u4JkJ.jpgstrong text
ERB to generate chart looks like:
I also encountered this issue and fixed it by making sure my date fields were all the same value. Since I was doing my aggregation by day, the time value on the field was meaningless. I quickly fixed the issue by converting the DateTime object to a Date object.
User.first.created_at.to_date
I hope this helps!
As previous answers have mentioned, this seems to be due to the data points not sharing x-axis values. However, Highcharts handles such irregular data just fine, and it's supported by chartkick. Just source Highcharts (and jQuery as a dependency) instead of Google charts, e.g.
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="path/to/chartkick.js"></script>
For a demo, check out: http://www.highcharts.com/demo/spline-irregular-time
I just encountered the same issue and I figured it out. Chartkick cannot draw lines if one of the data element is an empty hash.
In your case, the third array object has an empty data hash. Replace it with the below snippet and you should see lines
[3] {
:name => "smell",
:data => {
Fri, 16 May 2014 12:13:10 UTC +00:00 => 33.0,
Tue, 10 Jun 2014 19:28:05 UTC +00:00 => 32.5
}
:discrete => true
}
I ran into the same thing, and found that this happens when your data points don't share X-axis values. So in your example, the hash keys would need to be the same for each hash in the array.
Edit (2): I got this to work using Google Charts scatter chart (https://developers.google.com/chart/interactive/docs/gallery/scatterchart) directly. I had to do some permutations on the data to make it work... The data needs to look like the following to get the multi-line chart effect:
[['count', 'users', 'page views', 'bounces'],
[ new Date('09 Oct 2014'), 0, null, null ],
[ new Date('10 Oct 2014'), 1, null, null ],
[ new Date('11 Oct 2014'), 3, null, null ],
[ new Date('12 Oct 2014'), 3, null, null ],
[ new Date('09 Oct 2014'), null, 2, null ],
[ new Date('11 Oct 2014'), null, 15, null ],
[ new Date('12 Oct 2014'), null, 17, null ],
[ new Date('10 Oct 2014'), null, null, 1 ],
[ new Date('11 Oct 2014'), null, null, 10 ],
[ new Date('12 Oct 2014'), null, null, 10 ]]
There's also this: https://github.com/JohnathanWeisner/chartkick/tree/FEATURE/Trendline. It's a fork that adds scatter_chart, but I didn't feel like doing the necessary data permutations in ruby :P
Related
How can I restrict a page only one by one user without authentification and with a delay of 3min between the first and second user. If anyone have a clue or a solution ?
Here is what I try to do :
A unique User land in my page and fill a form and as I want to pick him by making a User.last I need him to be uniq on my page (to not disturb the registration and to be sure that i'm picking the right user with the User.last) and to wait 3 min for the second user to access this page.
Like I have 10 peoples trying to access my website, 1 in filling the form, the 9 others are standing in a queue and waiting to access to my page.
Actualluy try to do this in Ruby on Rails.
My view with the field looks like this (need to allow only one by one user on this page) :
<div class="container">
<center><h1>New Connection </h1></center>
<%= form_with model: #email, local: true do |form|%>
<% if #email.errors.any? %>
<div id="error explanation" class="alert alert-danger">
<p>Erreur(s) : </p>
<ul>
<% #email.errors.full_messages.each do |message|%>
<li><%=message%></li>
<% end %>
</ul>
</div>
<% end %>
<div class="form-group">
<%= label_tag :email %> :
<%= form.email_field :email, placeholder: "Email", class: "form-control" %>
</div>
<div class="form-group">
<%= form.submit class: "btn btn-primary btn-lg btn-block", value: "Se connecter" %>
</div>
<%end%>
</div>
My email controller :
class EmailsController < ApplicationController
def index
redirect_to root_path
end
def new
#email = Email.new
sessions = ActiveRecord::SessionStore::Session.pluck(:updated_at)
#return an array like this :
[Tue, 21 Jan 2020 13:27:03 UTC +00:00, Tue, 21 Jan 2020 13:27:09 UTC +00:00, Tue, 21 Jan 2020 13:27:42 UTC +00:00, Tue, 21 Jan 2020 13:31:33 UTC +00:00, Tue, 21 Jan 2020 13:36:21 UTC +00:00, Tue, 21 Jan 2020 13:42:02 UTC +00:00, Tue, 21 Jan 2020 13:42:02 UTC +00:00, Tue, 21 Jan 2020 13:42:03 UTC +00:00, Tue, 21 Jan 2020 13:42:03 UTC +00:00, Tue, 21 Jan 2020 13:42:04 UTC +00:00, Tue, 21 Jan 2020 13:42:04 UTC +00:00, Tue, 21 Jan 2020 13:44:47 UTC +00:00, Tue, 21 Jan 2020 13:44:47 UTC +00:00, Tue, 21 Jan 2020 13:46:24 UTC +00:00, Tue, 21 Jan 2020 13:49:10 UTC +00:00, Tue, 21 Jan 2020 13:49:38 UTC +00:00, Tue, 21 Jan 2020 13:50:54 UTC +00:00, Tue, 21 Jan 2020 13:50:54 UTC +00:00, Tue, 21 Jan 2020 14:03:42 UTC +00:00, Tue, 21 Jan 2020 14:07:11 UTC +00:00, Tue, 21 Jan 2020 14:07:11 UTC +00:00, Tue, 21 Jan 2020 14:07:12 UTC +00:00, Tue, 21 Jan 2020 14:07:12 UTC +00:00, Tue, 21 Jan 2020 14:36:39 UTC +00:00, Tue, 21 Jan 2020 14:36:48 UTC +00:00, Tue, 21 Jan 2020 14:36:57 UTC +00:00, Tue, 21 Jan 2020 14:42:02 UTC +00:00, Tue, 21 Jan 2020 14:42:03 UTC +00:00, Tue, 21 Jan 2020 14:44:16 UTC +00:00, Tue, 21 Jan 2020 14:52:46 UTC +00:00, Tue, 21 Jan 2020 14:52:47 UTC +00:00, Tue, 21 Jan 2020 14:52:47 UTC +00:00, Tue, 21 Jan 2020 14:54:48 UTC +00:00, Wed, 22 Jan 2020 08:09:47 UTC +00:00, Wed, 22 Jan 2020 08:09:48 UTC +00:00, Wed, 22 Jan 2020 08:12:06 UTC +00:00, Wed, 22 Jan 2020 08:12:07 UTC +00:00, Wed, 22 Jan 2020 08:12:16 UTC +00:00, Wed, 22 Jan 2020 08:12:17 UTC +00:00, Wed, 22 Jan 2020 08:12:17 UTC +00:00, Wed, 22 Jan 2020 08:12:29 UTC +00:00, Wed, 22 Jan 2020 08:12:39 UTC +00:00, Wed, 22 Jan 2020 08:12:40 UTC +00:00, Wed, 22 Jan 2020 08:13:07 UTC +00:00, Wed, 22 Jan 2020 08:13:07 UTC +00:00, Wed, 22 Jan 2020 08:13:08 UTC +00:00, Wed, 22 Jan 2020 08:15:34 UTC +00:00, Wed, 22 Jan 2020 08:22:38 UTC +00:00, Wed, 22 Jan 2020 08:25:28 UTC +00:00, Wed, 22 Jan 2020 08:25:29 UTC +00:00, Wed, 22 Jan 2020 08:25:29 UTC +00:00, Wed, 22 Jan 2020 08:29:24 UTC +00:00, Wed, 22 Jan 2020 08:36:15 UTC +00:00, Wed, 22 Jan 2020 08:36:16 UTC +00:00, Wed, 22 Jan 2020 08:36:16 UTC +00:00, Wed, 22 Jan 2020 08:36:17 UTC +00:00, Wed, 22 Jan 2020 08:36:17 UTC +00:00, Wed, 22 Jan 2020 08:36:18 UTC +00:00, Wed, 22 Jan 2020 08:36:18 UTC +00:00, Wed, 22 Jan 2020 08:36:30 UTC +00:00, Wed, 22 Jan 2020 08:40:30 UTC +00:00, Wed, 22 Jan 2020 08:40:30 UTC +00:00, Wed, 22 Jan 2020 08:41:14 UTC +00:00, Wed, 22 Jan 2020 08:50:25 UTC +00:00, Wed, 22 Jan 2020 08:50:26 UTC +00:00, Wed, 22 Jan 2020 08:50:27 UTC +00:00, Wed, 22 Jan 2020 08:50:37 UTC +00:00, Wed, 22 Jan 2020 08:50:37 UTC +00:00, Wed, 22 Jan 2020 08:50:38 UTC +00:00, Wed, 22 Jan 2020 08:50:48 UTC +00:00, Wed, 22 Jan 2020 08:50:48 UTC +00:00, Wed, 22 Jan 2020 08:50:49 UTC +00:00, Wed, 22 Jan 2020 08:57:58 UTC +00:00, Wed, 22 Jan 2020 08:57:59 UTC +00:00, Wed, 22 Jan 2020 09:04:29 UTC +00:00, Wed, 22 Jan 2020 09:04:29 UTC +00:00, Wed, 22 Jan 2020 09:04:30 UTC +00:00, Wed, 22 Jan 2020 09:04:39 UTC +00:00, Wed, 22 Jan 2020 09:04:39 UTC +00:00, Wed, 22 Jan 2020 09:04:40 UTC +00:00, Wed, 22 Jan 2020 09:04:49 UTC +00:00, Wed, 22 Jan 2020 09:04:49 UTC +00:00, Wed, 22 Jan 2020 09:04:50 UTC +00:00, Wed, 22 Jan 2020 09:13:21 UTC +00:00, Wed, 22 Jan 2020 09:17:48 UTC +00:00, Wed, 22 Jan 2020 09:20:03 UTC +00:00, Wed, 22 Jan 2020 09:27:54 UTC +00:00, Wed, 22 Jan 2020 09:27:54 UTC +00:00, Wed, 22 Jan 2020 09:28:04 UTC +00:00, Wed, 22 Jan 2020 09:28:05 UTC +00:00, Wed, 22 Jan 2020 09:35:42 UTC +00:00, Wed, 22 Jan 2020 09:35:43 UTC +00:00, Wed, 22 Jan 2020 09:35:58 UTC +00:00]
#How can I say that if a session is in the same minute than the previous session, redirect the one last one to another url?
end
def create
#email = Email.create(email_params)
respond_to do |format|
if#email.persisted?
format.html {redirect_to invoice_index_path, notice: 'Email Validated '}
else
format.html{render :new}
end
end
end
private
def email_params
params.require(:email).permit(:email, :id_user)
end
end
EDIT :
As suggested in the comment part, I tried to use the session, I can access to the session made by rails with request.session_options[:id] but how can I count them ?
EDIT 2 :
As suggested by ARK in the comment section, I try to use the Session created by Rails, I edited my controller part .
How can I say that if a session is in the same minute than the previous session, redirect the one last one to another url ?
I've got an array with with arrays, containing a key and a timestamp.
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 22:00:51 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 22:00:32 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 21:58:33 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 21:58:01 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 21:58:51 CEST +02:00],
["3wyadsrrdxtgieyxx_lgka", Sat, 13 May 2017 01:09:01 CEST +02:00],
["y-5he42vlloggjb_whm8jw", Sat, 22 Apr 2017 22:48:31 CEST +02:00],
["oaxej30u9we17onlug4orw", Sun, 23 Apr 2017 01:46:48 CEST +02:00],
["oaxej30u9we17onlug4orw", Sun, 23 Apr 2017 02:06:56 CEST +02:00],
["rqjwg1ka43mvri0dmrdxvg", Sun, 23 Apr 2017 17:23:34 CEST +02:00],
["ok8nq6tg-kor9jglsuhoyw", Tue, 25 Apr 2017 13:02:16 CEST +02:00],
["riwfm0m-0rmbb6e9kyug2g", Sat, 06 May 2017 06:12:27 CEST +02:00],
["riwfm0m-0rmbb6e9kyug2g", Sat, 06 May 2017 06:17:01 CEST +02:00],
["riwfm0m-0rmbb6e9kyug2g", Sat, 06 May 2017 06:18:04 CEST +02:00],
["gbqfn3_d_tritqoey5khjw", Sat, 06 May 2017 14:14:55 CEST +02:00],
["j___x1oap-veh0u1fo_oua", Sun, 07 May 2017 14:22:37 CEST +02:00],
...
I received this list by ActiveRecord.
MyModel.all.pluck(:token, :created_at)
The Model containing some uniq tokens and some duplicates.
The duplicates are interesting.
I want to group the timestaps by the key and look for the first and the last timestamp for each key.
So I grouped the array as following:
grp = arr.group_by { |key, ts| key}
Now I receive a list like this:
"vwfv8n5obwqmaw8r9fj-yq"=>[
["vwfv8n5obwqmaw8r9fj-yq", Thu, 11 May 2017 10:24:42 CEST +02:00]
],
"kacec6ybetpjdzlfgnnxya"=> [
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 22:00:31 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 22:01:43 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 21:58:17 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 21:59:05 CEST +02:00],
["kacec6ybetpjdzlfgnnxya", Fri, 12 May 2017 21:59:59 CEST +02:00]
],
...
Is it possible to sort the dates to get the first and the last date easily?
Am I too complicated? I think there should be an easier way to handle the raw data.
To get a a hash with the token as the key and the timestamps as values:
# this gives the same MIN and MAX if there is only one created_at in the group
rows = MyModel.group(:token)
.pluck("token, MIN(created_at), MAX(created_at)")
# loop though rows and create a hash
rows.each_with_object({}) do |(token, *t), hash|
hash[token] = t.uniq # removes dupes
end
{
"rqjwg1ka43mvri0dmrdxvg"=>[2017-04-23 15:23:34 UTC],
"riwfm0m-0rmbb6e9kyug2g"=>[2017-05-06 04:12:27 UTC, 2017-05-06 04:18:04 UTC]
# ...
}
If you are simply looking for the records which have duplicates you can just use a WHERE clause that counts the records:
MyModel.where("(SELECT COUNT(*) FROM things t WHERE t.token = things.token) > 1")
You could do this:
# you already have this bit
grp = arr.group_by { |key, ts| key}
# get the minmax values for each group
grp.map { |k, values_array| { k => values_array.minmax } }.reduce Hash.new, :merge
This should yield something that looks like:
{
"vwfv8n5obwqmaw8r9fj-yq"=>[
[Thu, 11 May 2017 10:24:42 CEST +02:00, Thu, 11 May 2017 10:24:42 CEST +02:00]
],
"kacec6ybetpjdzlfgnnxya"=> [
[Fri, 12 May 2017 21:58:17 CEST +02:00, Fri, 12 May 2017 22:01:43 CEST +02:00]
],
...
}
try something like this:
MyModel.order(:created_at).pluck(:token, :created_at).group_by { |key, ts| key }.flat_map{ |k, v| { k => [v.first, v.last] } }
In rails how to get the exect day after adding offset
irb(main):066:0> DateTime.now.utc
=> Sat, 29 Mar 2014 19:12:57 +0000
after adding 5.30 hours it should show 30 march. why it is 29 again .anything I missed here
irb(main):065:0> DateTime.now.utc.change(:offset => "+0530")
=> Sat, 29 Mar 2014 19:09:03 +0530
Basically I'd like to get a random datetime within the last year:
rand(1.year).ago #=> Sun, 22 Sep 2013 18:37:44 UTC +00:00 (example)
But how do I go about specifying or limiting this to times on the hour? For example:
Sun, 22 Sep 2013 18:00:00 UTC +00:00
Sat, 02 Nov 2013 10:00:00 UTC +00:00
Fri, 12 Apr 2013 21:00:00 UTC +00:00
I finally found what I was looking for. #Stoic's answer is very good but I found this available method (http://api.rubyonrails.org/classes/DateTime.html):
rand(1.year).ago.beginning_of_hour
Does exactly the same thing but looks neater and prevents you from having to write your own function.
Rounding datetime to the nearest hour in Rails would be
(DateTime.now + 30.minutes).beginning_of_hour
Not the answer to the actual question, but it does answer the title of the question (which is how i got here).
Try this:
def random_time_to_nearest_hour
time = rand(1.year).ago
time - time.sec - 60 * time.min
end
Examples:
[1] pry(main)> random_time_to_nearest_hour
=> Sun, 28 Apr 2013 16:00:00 UTC +00:00
[2] pry(main)> random_time_to_nearest_hour
=> Sat, 08 Jun 2013 15:00:00 UTC +00:00
[3] pry(main)> random_time_to_nearest_hour
=> Thu, 22 Aug 2013 23:00:00 UTC +00:00
[4] pry(main)> random_time_to_nearest_hour
=> Tue, 29 Jan 2013 14:00:00 UTC +00:00
[5] pry(main)> random_time_to_nearest_hour
=> Tue, 13 Aug 2013 06:00:00 UTC +00:00
[6] pry(main)> random_time_to_nearest_hour
=> Mon, 03 Jun 2013 08:00:00 UTC +00:00
[7] pry(main)>
Note that, this method will always floor down to the nearest hour, but since you are anyways generating a random time, it wont matter if this time is getting floor'ed down or getting round'ed. :)
I have an Rails 4 application that collects attendance at church services. Some weeks there are two services and some weeks there is only one. I need to get the total attendance for each week and show it as a graph.
By calling:
Stat.calculate(:sum, :attendance, group: :date)
in the console I have been able to collect the data in a hash like this:
{Sun, 06 Jan 2013=>66, Sun, 13 Jan 2013=>65, Sun, 20 Jan 2013=>60, Sun, 27 Jan 2013=>67, Sun, 03 Feb 2013=>60, Sun, 10 Feb 2013=>76, Sun, 17 Feb 2013=>65, Sun, 24 Feb 2013=>52, Sun, 03 Mar 2013=>52, Sun, 10 Mar 2013=>45, Sun, 17 Mar 2013=>56, Sun, 24 Mar 2013=>134, Sun, 31 Mar 2013=>76, Sun, 07 Apr 2013=>88, Sun, 14 Apr 2013=>87, Sun, 28 Apr 2013=>93, Sun, 05 May 2013=>93, Sun, 12 May 2013=>95, Sun, 19 May 2013=>90, Sun, 26 May 2013=>87, Sun, 02 Jun 2013=>71, Sun, 09 Jun 2013=>86, Sun, 16 Jun 2013=>109, Sun, 23 Jun 2013=>80, Sun, 30 Jun 2013=>68, Sun, 07 Jul 2013=>75, Sun, 14 Jul 2013=>73}
But What I need for my chart is an array of hashes in the form of:
{date: "Sun, 23 Jun 2013", attendance: 80}, {date: "Sun, 30 Jun 2013", attendance: 68"}
So I am trying to figure out how to convert the first form into the second form.
I'm sure its something pretty easy, but my limited rails knowledge is hitting a wall.
.collect{|key,value| {:date => key, :attendance => value} }
loop through and create a new hash where the original key becomes the value for date and the original value becomes the value for attendance. These new hashes are collected into an array.
You can think as below:
h = {"Sun, 06 Jan 2013"=>66, "Sun, 13 Jan 2013"=>65, "Sun, 20 Jan 2013"=>60 }
h.map{|k,v| Hash[:date,k,:attend,v]}
# => [{:date=>"Sun, 06 Jan 2013", :attend=>66},
# {:date=>"Sun, 13 Jan 2013", :attend=>65},
# {:date=>"Sun, 20 Jan 2013", :attend=>60}]