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] } }
I'm looking to check for consecutive dates and display them differently if they are consecutive.
I'm working with Garage Sales that have multiple dates per sale. I'd like to then cycle through each date, and group any consecutive dates to display as a group: Ex: Apr 28 - Apr 30
I also need to account for non-consecutive dates:
Ex: Apr 15, Apr 28 - 30
Additionally, weekly dates need to be recognized as non-consecutive (so basically avoid step checks):
Ex: Apr 16, Apr 23, Apr 30
So far, I'm taking each date that hasn't passed & ordering them properly.
garage_sale_dates.where("date > ?",Time.now).order(:date)
Thanks for any help! Let me know if any other info is needed.
You can use the slice_before method of Enumerable
dates = [Date.yesterday, Date.today, Date.tomorrow, Date.parse('2016-05-01'), Date.parse('2016-05-02'), Date.parse('2016-05-05')]
# => [Wed, 27 Apr 2016, Thu, 28 Apr 2016, Fri, 29 Apr 2016, Sun, 01 May 2016, Mon, 02 May 2016, Thu, 05 May 2016]
prev = dates.first
dates.slice_before { |d| prev, prev2 = d, prev; prev2 + 1.day != d }.to_a
# => [[Wed, 27 Apr 2016, Thu, 28 Apr 2016, Fri, 29 Apr 2016], [Sun, 01 May 2016, Mon, 02 May 2016], [Thu, 05 May 2016]]
Then you can simply join the 2-or-more-element arrays from the result with "-", and leave the single element arrays intact:
prev = dates.first
dates.slice_before { |d| prev, prev2 = d, prev; prev2 + 1.day != d }.
map{|d| d.size > 1 ? "#{d.first.to_s} - #{d.last.to_s}" : d.first.to_s }
# => ["2016-04-27 - 2016-04-29", "2016-05-01 - 2016-05-02", "2016-05-05"]
There is even a commented example in the docs that is technically equivalent to yours (but deals with integers, not dates).
a simple script would do the trick
def date_list(dates)
result = []
dates.each do |date|
if result.empty? || (date - result.last.last).to_i != 1
result << [date]
else
result.last << date
end
end
result
end
# make sure dates is an array of dates
dates = [Thu, 28 Apr 2016, Fri, 29 Apr 2016, Sun, 01 May 2016, Mon, 02 May 2016, Tue, 03 May 2016, Thu, 05 May 2016, Fri, 06 May 2016, Sat, 07 May 2016, Sun, 08 May 2016]
#this would give you an array of date ranges that you wanted
date_list(dates)
=> [
[Thu, 28 Apr 2016, Fri, 29 Apr 2016],
[Sun, 01 May 2016, Mon, 02 May 2016, Tue, 03 May 2016],
[Thu, 05 May 2016, Fri, 06 May 2016, Sat, 07 May 2016, Sun, 08 May 2016]
]
I found a simpler solution using chunk_while method (available from Ruby 2.4.6).
Based on BoraMa answer:
dates = [Date.yesterday, Date.today, Date.tomorrow, Date.parse('2020-05-01'), Date.parse('2020-05-02'), Date.parse('2020-05-05')]
# => [Thu, 26 Mar 2020, Fri, 27 Mar 2020, Sat, 28 Mar 2020, Fri, 01 May 2020, Sat, 02 May 2020, Tue, 05 May 2020]
dates.chunk_while { |date_before, date_after| (date_after - date_before).to_i == 1 }.to_a
# => [[Thu, 26 Mar 2020, Fri, 27 Mar 2020, Sat, 28 Mar 2020], [Fri, 01 May 2020, Sat, 02 May 2020], [Tue, 05 May 2020]]
I think is more readable and it needs less steps to get same result.
Using a Date you can do the subtraction, it would be something like:
date1 = 1.day.ago
date2 = 2.day.ago
(date1.to_date - date2.to_date).to_i
=> 1
Adding onto Matouš Borák's answer, if you want to change the date format such that it would match what was asked in the question i.e. Apr 15, Apr 28 - 30
dates = [Date.yesterday, Date.today, Date.tomorrow, Date.parse('2021-10-01'), Date.parse('2021-10-02'), Date.parse('2021-10-05')]
# => [Wed, 01 Sep 2021, Thu, 02 Sep 2021, Fri, 03 Sep 2021, Fri, 01 Oct 2021, Sat, 02 Oct 2021, Tue, 05 Oct 2021]
prev = dates.first
dates.slice_before { |d| prev, prev2 = d, prev; prev2 + 1.day != d }.
map{|d| d.size > 1 ? "#{d.first.strftime('%b %d')} - #{d.last.strftime('%d')}" : d.first.strftime('%b %d') }
# => ["Sep 01 - 03", "Oct 01 - 02", "Oct 05"]
I am creating a list of Datetimes for available booking in a Rails app. I wrote a quick function to group the Datetimes by day in order to organize them for display in my view.
My Code:
def self.sort_by_day(times)
day = times[0].strftime("%d")
array = []
days_hash = Hash.new
counter = 0
while counter < times.size
if times[counter].strftime("%d") == day
array.push(times[counter])
counter += 1
else
days_hash[times[counter].strftime("%d")] = array
logger.debug "#{days_hash}"
array.clear
array << times[counter]
day = times[counter].strftime("%d")
counter += 1
end
end
days_hash
end
{"18"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan 2016 09:00:00
-0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016 11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016 13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016 15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016 17:00:00 -0500], "19"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan 2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "20"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "21"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "22"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "24"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "25"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "26"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "27"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "28"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "29"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500], "31"=>[Fri, 29 Jan 2016 08:00:00 -0500, Fri, 29 Jan
2016 09:00:00 -0500, Fri, 29 Jan 2016 10:00:00 -0500, Fri, 29 Jan 2016
11:00:00 -0500, Fri, 29 Jan 2016 12:00:00 -0500, Fri, 29 Jan 2016
13:00:00 -0500, Fri, 29 Jan 2016 14:00:00 -0500, Fri, 29 Jan 2016
15:00:00 -0500, Fri, 29 Jan 2016 16:00:00 -0500, Fri, 29 Jan 2016
17:00:00 -0500]}
My code is overwriting the hash values of previous days each time a new key/value pair is assigned.I previously got similar results using arrays. What am I doing wrong here and how is the hash overwriting previous values?
If you have an array of Rails DateTime object, and you want to group them by day of month and have the resultant hash ordered by day value, then, you can do the following:
ary.sort_by(&:day).group_by(&:day)
Working example for illustration is provided below:
require "pp"
require "active_support/core_ext/date_time"
ary = [
(DateTime.civil_from_format :local, 2015, 12, 13),
(DateTime.civil_from_format :local, 2015, 10, 10),
(DateTime.civil_from_format :local, 2015, 11, 10),
(DateTime.civil_from_format :local, 2015, 11, 11),
(DateTime.civil_from_format :local, 2015, 11, 12),
(DateTime.civil_from_format :local, 2015, 12, 13),
]
pp ary.sort_by(&:day).group_by(&:day)
#=> {10=>[Sat, 10 Nov 2015 00:00:00 +0530, Sat, 10 Oct 2015 00:00:00 +0530],
# 11=>[Wed, 11 Nov 2015 00:00:00 +0530],
# 12=>[Thu, 12 Nov 2015 00:00:00 +0530],
# 13=>[Sun, 13 Dec 2015 00:00:00 +0530, Sun, 13 Dec 2015 00:00:00 +0530]}
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