如何在默认范围内按相关模型订购? - Rails 3.1

时间:2011-12-12 08:45:58

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

如何编写以下默认范围:

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字段(属于相关模型)

进行排序

有什么建议吗?

3 个答案:

答案 0 :(得分:13)

试试这个:

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

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

答案 1 :(得分:5)

这是你可以做的事情来获得所需的功能,但这样做并不是一个好主意,请阅读到最后

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

排序

看起来像

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

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

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

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

通过这种方式,您始终可以在代码中了解从数据库中正确加载的内容

答案 2 :(得分:2)

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

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

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

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