2013-06-28 78 views
4

我試圖按照Rails中相關模型中的字段進行排序。如果相關模型被另一個參數過濾,我所研究的所有解決方案都沒有解決?按ActiveRecord條件在相關模型中按字段排序

項目模型

class Item < ActiveRecord::Base 
    has_many :priorities 

相關型號:

class Priority < ActiveRecord::Base 
    belongs_to :item 

    validates :item_id, presence: true 
    validates :company_id, presence: true 
    validates :position, presence: true 
end 

我使用的where子句中檢索項目:

@items = Item.where('company_id = ? and approved = ?', @company.id, true).all 

我需要訂購「位置'colu在相關表格中。麻煩的是,在優先模式中,一個項目可能被列入多個公司。所以倉位取決於他們擁有的company_id。當我顯示這些項目時,它是針對一家公司,按公司內部的位置排序的。什麼是完成這個的正確方法?任何幫助表示讚賞。

PS - 我知道acts_as_list然而發現它不適合我這裏的設置,所以我手動處理保存排序,同時仍然使用jquery ui sortable。

回答

8

你可以使用includes方法以包含構建關聯,然後按順序排列。你只要確保你消除了你所訂購的領域,並且有一些事情你應該在here上閱讀,以便加載。所以它可能是這樣的:

@items = Item.includes(:priorities).where('company_id = ? and approved = ?', @company.id, true).order("priorities.position ASC") 
+0

這對我來說非常好。謝謝,傑森!我必須添加的唯一東西是items.company_id到where子句。 – Drew

1
class Item < ActiveRecord::Base 
    has_many :priorities 
    belongs_to :company 
    def self.approved 
    where(approved: true) 
    end 
end 

class Priority < ActiveRecord::Base 
    belongs_to :item 
end 

class Company < ActiveRecord::Base 
    has_many :items 
end 

@company = Company.find(params[:company_id]) 
@items = @company.items.joins(:priorities).approved.order(priorities: :position) 

如果我理解了你的問題,那就是我該怎麼做的。它並不需要太多的解釋,但要知道你是否不確定。

如果你想更多的將其推入模型中,如果它是一個共同的要求,你可以範圍的順序:

class Item < ActiveRecord::Base 
    has_many :priorities 
    belongs_to :company 

    def self.approved 
    where(approved: true) 
    end 

    def self.order_by_priority_position 
    joins(:priorities).order(priorities: :position) 
    end 
end 

,只是使用:@company.items.approved.order_by_priority_position