5

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

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

结果将产生:

Jan - 313
Feb - 3131
Mar - 44444
etc...

有没有一种简单的方法可以用 rails 来做到这一点,或者您是否需要为每个月编写一个查询?

谢谢

4

5 回答 5

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

然后你会这样称呼它:

@counts = NewsFeed.exclude_user_ids(['1','2']).group_by_month.count

这会给你:

{2014-01-01 00:00:00 UTC=>313, 2014-02-01 00:00:00 UTC=>3131}

然后你输出(haml):

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

这将导致:

Month: Jan, Count: 313
Month: Feb, Count: 3131
于 2014-02-05T13:15:30.390 回答
3

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

NewsFeed.count(:group=>"date_trunc('month', created_at)",:conditions=>"user_id NOT IN (?)",[exluded_ids])
于 2012-05-15T21:28:16.143 回答
2

也许这会起作用:

monthly_counts = NewsFeed.select("date_trunc('month', created_at) as month, COUNT(id) as total").where("user_id NOT IN (?)",[exluded_ids]).group("month")
monthly_counts.each do |monthly_count|
  puts "#{monthly_count.month} - #{monthly_count.total}"
end
于 2012-05-16T06:15:15.873 回答
1

http://railscasts.com/episodes/29-group-by-month

NewsFeed.where("user_id is not in (?)",[user_ids]).group_by { |t| t.created_at.beginning_of_month } => each {|month,feed| ...}

NewsFeed.select("*,MONTH(created_at) as month").where("user_id is not in (?)",[user_ids]).group("month") => ...
于 2012-05-15T21:36:45.023 回答
1

在 Rails 5 中

NewsFeed.select('id').group("date_trunc('month', created_at)").count
于 2019-08-01T09:32:08.117 回答