Rails查询根据嵌套模型的数量进行排序?

我有两个模型:Group&GroupMember

我想返回组,按最高的GroupMember计数排序? 如何在Rails中设置这种类型的连接/查询计数?

使用counter_cache,生活变得如此简单:

$ rails g migration add_group_member_counts_to_groups # migration def change add_column :groups, :group_members_count, :integer, default: 0 end class GroupMember < ActiveRecord::Base belongs_to :group, counter_cache: true end class Group < ActiveRecord::Base has_many :group_members scope :order_by_group_members_count, order('group_members_count DESC') end Group.order_by_group_members_count # => What you're looking for 

只有一个查询,仅在组表上。

编辑

如果您需要重置group_members_count:

 ids = Group.select(:id).map &:id ids.each do |id| Group.reset_counters(id, :group_members) end 

(因为reset_counters不带一个id数组)

在将来的Rails 3.2.0中 ,您将编写:

 ids = Group.pluck(:id) 

我等不及了;-)

 class Group < ActiveRecord::Base has_many :group_members default_scope order('(select count(1) from group_members where group_members.group_id = groups.id) desc') end 

请注意,这会在您的订单子句中创建一个子查询,这可能会产生一个包含许多组记录的重要SQL减速。 如果频繁使用此信息,则最好有Delba建议的计数器缓存。