Rails / ActiveRecord: как упорядочить записи по большинству ассоциаций со связанной моделью? - PullRequest
0 голосов
/ 30 января 2019

У меня есть две модели.

class Tourist < ApplicationRecord
  has_many :visits
  has_many :countries, through: :visits
end

class Country < ApplicationRecord
  has_many :visits
  has_many :tourists, through: :visits
end

class Visit < ApplicationRecord
  belongs_to :country
  belongs_to :tourist
end

Я пытаюсь найти способ сортировки стран по количеству туристических ассоциаций.

Меня убеждают, что я должен присоединитьсятаблица туриста со странами, затем группируйте по туристам перед тем, как размещать группу с наибольшим количеством наверху.

Country.joins(:tourist).group(:tourist_id).order('COUNT(*)')

Однако это не совсем верно.Во-первых, я получаю предупреждение об амортизации.

DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with a non-attribute argument(s): "COUNT(*)". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql(). (called from __pry__ at (pry):61)

Кроме того, я не думаю, что получаю правильные значения, потому что все после first равно нулю.

Что является правильнымспособ получить записи с наибольшим количеством ассоциаций?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вы можете использовать left_joins для этого запроса

Country.left_joins(:tourists).group('tourists.id').order('COUNT(tourists.id)')
0 голосов
/ 30 января 2019

Я не тестировал, но следующее должно работать,

Country.joins(:tourists).group('tourists.id').order('COUNT(tourists.id)')

Он будет сортировать сбор стран по количеству ассоциированных туристов.

Чтобы получить наибольшее количество сверху, измените порядок, как показано ниже,

Country.joins(:tourists).group('tourists.id').order('COUNT(tourists.id) DESC')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...