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

如何编写以下默认范围:

class SimilarMerchant  'similar_merchant_id', :class_name => "Merchant" # scopes default_scope order('merchants.is_paid DESC').order('score DESC') end 

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

任何建议?

试试这个:

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

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

这是你可以做什么来获得所需的function,但这样做并不是一个好主意,请阅读直到最后

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

看起来像

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

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

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

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

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

那么,您是否希望所有来自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 )。