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

Jac*_*cob 8 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
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

Mar*_*oda 13

试试这个:

default_scope joins(:merchant).order('merchants.is_paid DESC, score DESC')
Run Code Online (Sandbox Code Playgroud)

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


key*_*one 5

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

您可以定义默认范围以包括商家关联,然后按顺序排列 merchants.is_paid DESC, score DESC

看起来像

default_scope includes(:merchants).order('merchants.is_paid DESC, score DESC')
Run Code Online (Sandbox Code Playgroud)

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

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

scope :with_merchants, includes(:merchants).order(...)
Run Code Online (Sandbox Code Playgroud)

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