使用连接(Rails)指定has_many关联的默认顺序?

时间:2012-09-17 05:05:40

标签: ruby-on-rails sql-order-by rails-activerecord

我有一个简单的客户模型,与购买模型有很多关系。

class Customer < ActiveRecord::Base
  has_many :purchases
end

我一再发现我需要通过以下方式在我的观看中订购Customer.purchases:

@customer.purchases.joins(:shop).order("shops.position").order(:position) #yes, two orders chained

为了保持干燥,我想把它放在一个集中的地方,所以我不必反复这样做。理想情况下,我想将其作为Customer.purchases的默认排序。例如:

class Customer < ActiveRecord::Base
  has_many :purchases, :order => joins(:shop).order("shops.position").order(:position)
end

显然上述方法不起作用。我该怎么做?

3 个答案:

答案 0 :(得分:0)

在您的客户模型中,您指定加入(:商店)是键:订单的值。我认为这是问题,所以你可以使用连接作为键而不是下面的顺序,

class Customer < ActiveRecord::Base
  has_many :purchases, :joins => [:shop], :order => "shops.position"
end

我认为它可能有用。

答案 1 :(得分:0)

在您的购买模式中,您可以创建一个类方法:

Purchase.rb:

def self.order_by_position
  joins(:shop).order("shops.position").order(:position)
end

然后你可以这样说:

@customer.purchases.order_by_position
Purchase.order_by_position

答案 2 :(得分:0)

您可以在Customer上创建一个返回已订购商品的方法:

class Customer < ActiveRecord::Base
  has_many :purchases

  def ordered_purchases
    purchases.joins(:shop).order("shops.position").order(:position)
  end
end

并从您的观看中致电@customer.ordered_purchases