Rails запрос, который сортирует по количеству вложенных моделей? - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть две модели: Group & GroupMember

Я хотел бы вернуть Группы, отсортированные по наибольшему количеству членов группы? Как вы настраиваете этот тип количества соединений / запросов в Rails?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Жизнь намного проще с 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)

Не могу дождаться; -)

1 голос
/ 07 декабря 2011
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...