Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 基于嵌套模型计数排序的Rails查询?_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 基于嵌套模型计数排序的Rails查询?

Ruby on rails 基于嵌套模型计数排序的Rails查询?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我有两个模型:组和组成员 我想返回按最高GroupMember计数排序的组?如何在Rails中设置这种类型的连接/查询计数?使用计数器缓存,生活会轻松得多: $ rails g migration add_group_member_counts_to_groups # migration def change add_column :groups, :group_members_count, :integer, default: 0 end class GroupMember <

我有两个模型:组和组成员


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

使用计数器缓存,生活会轻松得多:

$ 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
因为reset_计数器不接受ID数组

将来,您将写:

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

请注意,这将在order子句中创建一个子查询,这可能会对许多组记录产生显著的SQL减速。如果经常使用此信息,最好按照Delba的建议使用计数器缓存。

谢谢,但出于各种原因,我现在不想使用计数器缓存。如何使用Rails实现这一点?感谢+1提供了有用的重置计数器代码-也不知道如何拔出-很好。
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