2012-01-28 2 views
0

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

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

Но это дает мне все записи, которые указаны в «А» не в текущем месяце. Я что-то упускаю?

Спасибо.

+0

Вы получаете все записи, которые имеют 'state = 'A'', а затем группируют их. Он генерирует хэш, где ключи начинаются с месяцев и значений - массивы записей, которые создаются в соответствующие месяцы. Применение 'count' к этому дает вам всего несколько месяцев, когда записи с' state = 'A'' создаются. Можете ли вы лучше описать результат, который хотите получить? –

+0

А не упоминается, что счет мой плохой. я просто хочу получить счет записи, созданный в текущем месяце, который указывается в 'A'. –

+0

Если вы хотите только подсчитать записи с 'state = 'A'', созданными в текущем месяце, почему вам нужна группировка? Вы хотите, чтобы количество записей было создано за каждый месяц? –

ответ

0

Вы можете получить записи с 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 для группировки строк по месяцам и применять к нему значение count. В этом случае вы не будете извлекать сами записи из БД, которые будут быстрее, если у вас достаточно большая таблица.

+0

спасибо, что сейчас решает мою проблему. но если я хочу получить всю статистику о записи, как мне это сделать? я думаю, что это будет моим следующим вопросом в ближайшем будущем :). –

+0

Добавлено решение для получения статистики в месяц. –