如何编写以下默认范围:
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
字段(属于相关模型)
有什么建议吗?
答案 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')
如果将其定义为单独的范围并在需要时调用此范围会更好。此外,您需要决定是否需要关系merchant
或similar_merchant
。如果您需要similar_merchant
,则必须执行joins(:similar_merchant)
。
请注意:商家是单数。即你必须指定模型中指定的关系名称(如belongs_to :merchant
)。