如何编写一个按月返回计数的rails查询?

AnA*_*ice 5 activerecord ruby-on-rails ruby-on-rails-3

采用标准的NewsFeed模型(id,user_id)

如何在NewsFeed模型中查询每月的记录数,然后排除一些user_id?

结果将产生:

Jan - 313
Feb - 3131
Mar - 44444
etc...
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以使用rails执行此操作,还是需要为每个月编写查询?

谢谢

phi*_*oye 10

在Rails 4中,执行此操作的方法是在模型上创建范围.

class NewsFeed < ActiveRecord::Base
  scope :group_by_month,   -> { group("date_trunc('month', created_at) ") }
  scope :exclude_user_ids, -> (ids) { where("user_id is not in (?)",ids) }
end
Run Code Online (Sandbox Code Playgroud)

然后你会称之为:

@counts = NewsFeed.exclude_user_ids(['1','2']).group_by_month.count
Run Code Online (Sandbox Code Playgroud)

这会给你:

{2014-01-01 00:00:00 UTC=>313, 2014-02-01 00:00:00 UTC=>3131}
Run Code Online (Sandbox Code Playgroud)

然后输出(haml):

- @counts.each do |m|
  = "Month: #{m[0].strftime("%b")}, Count: #{m[1]}"
Run Code Online (Sandbox Code Playgroud)

这将导致:

Month: Jan, Count: 313
Month: Feb, Count: 3131
Run Code Online (Sandbox Code Playgroud)


Yur*_*akh 3

活动记录中有计数和组语句可用,因此您可以执行类似的操作

NewsFeed.count(:group=>"date_trunc('month', created_at)",:conditions=>"user_id NOT IN (?)",[exluded_ids])
Run Code Online (Sandbox Code Playgroud)