在RoR中使用group_by和where语句

时间:2012-01-28 10:25:18

标签: ruby-on-rails ruby activerecord group-by

已经查看了this视频非常有用。但实际上我不想只是几个月的团队。我也希望将它们与条件分组。所以我有;

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

但它给了我所有记录,其中“A”中的状态并非当前月份。我错过了什么吗?

感谢。

1 个答案:

答案 0 :(得分: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按月对行进行分组,并将计数应用于该行。在这种情况下,如果你有一个很大的表,你将不会从数据库中获取记录本身会更快。