Жизнь намного проще с 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 не принимает массив идентификаторов)
В будущем Rails 3.2.0 , вы напишите:
ids = Group.pluck(:id)
Не могу дождаться; -)