Использование group_by с оператором where в RoR - PullRequest
0 голосов
/ 28 января 2012

Уже проверьте это видео, которое очень полезно.Но на самом деле я не хочу группировать только месяцы.Я тоже хочу сгруппировать их с условием.Итак, у меня есть;

MyModel.where("state = 'A'").all.group_by { |q| q.created_at.beginning_of_month }.count

Но он дает мне все записи, которые указаны в 'A', а не в конкретном месяце.Я что-то упустил?

Спасибо.

1 Ответ

0 голосов
/ 28 января 2012

Вы можете получить записи с state = 'A', которые были созданы в этом месяце следующим образом:

MyModel.where(['state = ? AND ? <= created_at AND created_at <= ?', 
               'A', Date.today.beginning_of_month, Date.today.end_of_month])

Применяя count к этому запросу, вы получите количество таких записей.

Если вам нужно количество записей в месяц, и вы можете сделать это так (хотя и не самым эффективным способом):

records = MyModel.where("state = 'A'").all
result = records.each_with_object(Hash.new { |h, k| h[k] = 0 }) do |record, hash|
  hash[record.created_at.beginning_of_month] += 1
end

Возможно, вам придется посмотреть, как Hash#new работает с блоком и что Enumerable#each_with_object делает.

Более эффективный способ подсчета записей в месяц - использовать простой SQL для группировки строк по месяцам, к которым применяется подсчет. В этом случае вы не получите сами записи из БД, что будет быстрее, если у вас достаточно большая таблица.

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