代码之家  ›  专栏  ›  技术社区  ›  user3574603

Rails/ActiveRecord:如何根据与相关模型的大多数关联来排序记录?

  •  0
  • user3574603  · 技术社区  · 5 年前

    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 回复  |  直到 5 年前
        1
  •  1
  •   ray    5 年前

    我没有测试,但以下必须工作,

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

    若要在顶部获得最大计数,请更改以下顺序,

    Country.joins(:tourists).group('tourists.id').order('COUNT(tourists.id) DESC')
    
        2
  •  0
  •   Rohit Lingayat    5 年前

    left_joins 对于此查询

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