如何在默认范围内按相关模型订购? – 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')
如果将其定义为单独的作用域并在需要时调用此作用域会更好。 此外,您需要决定是否需要关系merchant
或similar_merchant
。 如果你想要similar_merchant
,你将不得不做joins(:similar_merchant)
。
请注意:商家是单数。 即你必须指定模型中指定的关系名称(如belongs_to :merchant
)。