Как мне группировать по дням вместо даты? - PullRequest
18 голосов
/ 14 февраля 2011

хорошо, так что у меня есть

 >> list = Request.find_all_by_artist("someBand")
=> [#<Request id: 1, artist: "someBand", song: "someSong", venue: "Knebworth - Stevenage, United Kingdom", showdate: "2011-07-01", amount: nil, user_id: 2, created_at: "2011-01-01 18:14:08", updated_at: "2011-01-01 18:14:09".............

, а затем

list.group_by(&:created_at).map {|k,v| [k, v.length]}.sort
=> [[Sat, 01 Jan 2011 18:14:08 UTC +00:00, 10], [Sun, 09 Jan 2011 18:34:19 UTC +00:00, 1], [Sun, 09 Jan 2011 18:38:48 UTC +00:00, 1], [Sun, 09 Jan 2011 18:51:10 UTC +00:00, 1], [Sun, 09 Jan 2011 18:52:30 UTC +00:00, 1], [Thu, 10 Feb 2011 02:22:08 UTC +00:00, 1], [Thu, 10 Feb 2011 20:02:20 UTC +00:00, 1]]

проблема в том, что у меня есть несколько Sun, 09 января и пара для 10-го, вместо одного, как это

это то, что мне нужно

=> [[Sat, 01 Jan 2011 18:14:08 UTC +00:00, 10], [Sun, 09 Jan 2011 18:34:19 UTC +00:00, 4], [Thu, 10 Feb 2011 20:02:20 UTC +00:00, 2]]

Ответы [ 6 ]

21 голосов
/ 14 февраля 2011

Time - довольно сложный объект для группировки. Предполагая, что вы хотите сгруппировать по дате создания, а не по полному Time, начните создавать собственный метод в вашей модели для возврата критериев группировки.

Метод должен возвращать дату создания, возможно, в виде строки.

def group_by_criteria
  created_at.to_date.to_s(:db)
end

Затем группируйте по этому методу.

list.group_by(&:group_by_criteria).map {|k,v| [k, v.length]}.sort
17 голосов
/ 29 сентября 2014

Я думаю, что это гораздо более элегантное и простое решение

list.group_by{|x| x.created_at.strftime("%Y-%m-%d")} 
8 голосов
/ 17 мая 2014

Для этого есть драгоценный камень: groupdate .

Использование (из документов):

User.group_by_day(:created_at).count
# {
#   2013-04-16 00:00:00 UTC => 50,
#   2013-04-17 00:00:00 UTC => 100,
#   2013-04-18 00:00:00 UTC => 34
# }
3 голосов
/ 12 июля 2013

Ответ Ipsum на самом деле хороший и, вероятно, лучший:

В Ареле:

requests = Arel::Table.new(:requests)
query = requests.project("COUNT(*), CAST(requests.created_at AS DATE) as created_at")
query = query.group("CAST (requests.created_at AS DATE)")
Request.find_by_sql(query.to_sql)
1 голос
/ 09 мая 2018

вы можете использовать GROUP BY DATE(created_at) в MySQL

На коде ruby ​​вы можете использовать вот так

list.group('DATE(created_at)').map {|k,v| [k, v.length]}.sort
1 голос
/ 20 февраля 2017

Группа без лишних камней:

def self.group_by_day items
   data = items.group_by{|x| x.created_at.to_date}
   chart_data = {}

   data.each do |a,b|
     chart_data.merge!({a => b.count})
   end

   return chart_data
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...