Как отсортировать направляющие AR.find по количеству объектов в has_many отношениях

Проблема заключалась в том, что я хотел подписаться на didFinishLaunchingWithOptions, но в этот момент не все службы были настроены. Решение было подписаться в делегате didRegisterUserNotificationSettings.

10
задан Sam Schroeder 11 June 2009 в 13:41
поделиться

5 ответов

Если вам не нужен дополнительный столбец, вы всегда можете запросить дополнительный столбец в возвращаемом наборе результатов:

User.all(:select => "#{User.table_name}.*, COUNT(#{Photo.table_name}.id) number_of_photos",
         :joins => :photos,
         :order => "number_of_photos")

Это сгенерирует следующий SQL:

SELECT users.*, COUNT(photos.id) number_of_photos
FROM `users` INNER JOIN `photos` ON photos.user_id = users.id
ORDER BY number_of_photos
13
ответ дан 3 December 2019 в 13:47
поделиться

Если вы не хотите добавлять столбец кэша счетчика, единственный вариант - выполнить сортировку после поиска. Если вы : включите ассоциацию в свою находку, вы не потребуете дополнительной работы с базой данных.

users = User.find(:all, :include => :photos).sort_by { |u| -u.photos.size }

Обратите внимание на знак минуса в блоке sort_by для сортировки от большего к меньшему.

7
ответ дан 3 December 2019 в 13:47
поделиться

. Самый простой способ добиться этого, вероятно, - добавить к этой модели кэш счетчика, а затем выполнить сортировку по этому столбцу.

class Photo < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
end

И не забудьте добавить столбец в вашу таблицу users под названием photos_count .

Тогда вы сможете ...

User.find(:all, :order => 'photos_count')
19
ответ дан 3 December 2019 в 13:47
поделиться

Ваш вопрос не имеет смысла. Параметр : order указывает имя столбца и необязательное направление упорядочения, например asc (окончание) или desc (окончание).

Какого результата вы пытаетесь достичь?

-4
ответ дан 3 December 2019 в 13:47
поделиться

Кэш счетчика поможет, но вам понадобится дополнительный столбец в базе данных.

1
ответ дан 3 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: