2

用户可以提交资源和发表评论。

我想通过选择提交资源和评论的用户来显示最“活跃”的用户,并将结果从提交资源和评论最多的用户排序到最少。

**Resource**
has_many :users, :through => :kits
has_many :kits
belongs_to :submitter, class_name: "User"

**User**
has_many :resources, :through => :kits
has_many :kits
has_many :submitted_resources, class_name: "Resource", foreign_key: "submitter_id"

**Kits**
belongs_to :resource
belongs_to :user

**Comments**
belongs_to :user

我是 Rails 中这种 sql 的新手。我怎样才能得到这个记录集?

4

1 回答 1

2

首先,您需要将评论关联添加到 User 模型:

has_many :comments

有了这个,最简单的解决方案是这样做:

User.all.sort do |a,b|
   (a.submitted_resources.count + a.comments.count) <=> (b.submitted_resources.count + b.comments.count)
end

这将变得非常慢,因此如果您想做得更好,您将需要添加计数器缓存。在迁移中:

def up
  add_column :users, :submitted_resources_count, :integer
  add_column :users, :comments_count, :integer

  User.reset_column_information

  User.find_each do |u| 
    u.update_attributes! \
      :submitted_resources_count => u.submitted_resources.count,
      :comments_count => u.comments.count
  end
end

def down
  add_column :users, :submitted_resources_count
  add_column :users, :comments_count
end

运行此迁移后,您可以将原始查询更改为:

User.select('*, (submitted_resources_count + comments_count) AS activity_level').order('activity_level DESC')

这将非常有效地以正确的顺序返回所有用户,并且作为奖励,每个用户将有一个名为的只读属性activity_level,该属性将给出确切的提交资源 + 评论计数。

于 2012-07-12T08:25:44.380 回答