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建议的计数器缓存。