2012-09-17 50 views
0

我有一个与购买模型有很多关系的简单客户模型。使用联接(Rails)指定has_many关联的默认排序?

class Customer < ActiveRecord::Base 
    has_many :purchases 
end 

我多次发现,我需要在我在下面的意见的方式订购Customer.purchases:

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

在保持事物DRY的利益,我希望把这个地方集中,所以我不必反复做。理想情况下,我希望将其作为Customer.purchases的默认排序。例如:

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

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

回答

0

在您指定的客户模型中连接(:shop)是关键值:订单。我觉得现在的问题,所以你可以使用加入作为重点,而不是像下面顺序,

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

我认为它可能工作。

+0

似乎没有工作。给我一个'未定义的方法'键?'为零:NilClass'错误。 –

+0

请使用:joins => [:shop] – Mohanraj

+0

不可以。仍然有同样的错误... –

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 
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从您的意见。