【问题标题】:How to order by a related model in default scope? -- Rails 3.1如何在默认范围内按相关模型排序? -- 导轨 3.1
【发布时间】:2012-01-18 07:05:38
【问题描述】:

如何编写以下默认范围:

class SimilarMerchant < ActiveRecord::Base

  # relationships
  belongs_to :merchant
  belongs_to :similar_merchant, :foreign_key => 'similar_merchant_id', :class_name => "Merchant"

  # scopes
  default_scope order('merchants.is_paid DESC').order('score DESC')

end

基本上我想按merchant.is_paid 字段(属于相关模型)进行排序

有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    试试这个:

    default_scope joins(:merchant).order('merchants.is_paid DESC, score DESC')
    

    请记住,它可能会很慢,具体取决于记录的数量

    【讨论】:

    • 但请记住,它可能会很慢,具体取决于记录的数量
    • 任何按语句排序都可能很慢。这就像说这辆车可以倒车:-) 无论如何,工作正常,谢谢!
    • 我收到 'PG::Error: ERROR: missing FROM-clause entry`
    【解决方案2】:

    您可以通过以下方式获得所需的功能,但这样做并不是一个好主意,请阅读到最后

    您可以将默认范围定义为还包括商家关联,然后通过merchants.is_paid DESC, score DESC 订购

    看起来像

    default_scope includes(:merchants).order('merchants.is_paid DESC, score DESC')
    

    然而,这意味着每次您出于任何原因抓取类似的商家对象时,您也会加载关联

    这不是很好,我建议有一个明确的范围来加载具有关联和订购的类似商家:

    scope :with_merchants, includes(:merchants).order(...)
    

    这样你就可以在你的代码中知道到底从数据库中加载了什么

    【讨论】:

      【解决方案3】:

      那么,您是否希望来自SimilarMerchant 模型的所有查询都按merchants 中的列排序?我怀疑您的要求,但如果是这样,您还必须在默认范围内加入 merchants

      default_scope joins(:merchant).order('merchants.is_paid DESC, similar_merchants.score DESC')
      

      如果您将其定义为单独的范围并在需要时像这样调用此范围会更好。此外,您需要决定是否需要关系merchantsimilar_merchant。如果你想要similar_merchant,你必须做joins(:similar_merchant)

      注意 :merchant 是单数。即您必须指定模型中指定的关系名称(如belongs_to :merchant)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多