2011-06-15 59 views
0

我有三個型號,基本上是:Rails的高級排序

class Vendor 
    has_many :items 
end 

class Item 
    has_many :sale_items 
    belongs_to :vendor 
end 

class SaleItem 
    belongs_to :item 
end 

實際上,每個sale_item指向一個特定的item(但有可能是從item的基礎價格的不同相關的數量和銷售價格,因此是單獨的模型),並且每個item由特定的vendor製成。

我想按供應商名稱對所有sale_item進行排序,但這意味着要通過相關的item,因爲這是該關聯所在的位置。

我第一次嘗試是改變SaleItem以下:

class SaleItem 
    belongs_to :item 
    has_one :vendor, :through => :item 
end 

,讓我去找SaleItem.first.vendor,但不允許我做這樣的事情:

SaleItem.joins(:vendor).all(:order => "vendors.name") 

有一個簡單的方法來找出這些複雜的關聯和排序?如果有一個可以處理這些事情的插件,那將會特別好。在這個應用程序中,我有很多不同類型的表來添加排序,而且我覺得這將成爲大部分搜索工作的一部分。

+0

所以你只是想通過assoicated供應商分類你的項目? – 2011-06-16 00:41:31

+0

SaleItems有一個綁定到items.id的外鍵列(sale_items.item_id),並且Items有一個外鍵列(items。vendor_id)綁定到vendors.id。我想按與其關聯商品關聯的供應商對SaleItems進行分類。 – clem 2011-06-16 01:04:46

回答

0

這絕對可以用更復雜的SQL查詢(可能使用find_by_sql)來完成,但您也可以在Ruby中輕鬆完成。你可以試試下面的:

SaleItem.find(:all, :include => { :items => :vendors }).sort do |first,second| 
    first.vendor.name <=> second.vendor.name 
end 

我沒有測試過,所以它可能不是這樣的工作完全,但它應該給你一個可能的解決方案是一個好主意。

編輯:找到一篇似乎解決了這個問題的舊博客文章。希望這仍然適用於最新版本的ActiveRecord。

來源:http://matthewman.net/2007/01/04/eager-loading-objects-in-a-rails-has_many-through-association/

第二個編輯:直接從Rails文檔

要包含關聯的深層次結構,使用哈希:

for post in Post.find(:all, :include => [ :author, { :comments => { :author => :gravatar } } ])

那我不僅會抓住所有的評論,還會抓住所有的作者和gravatar的照片。您可以混合使用任意組合的符號,數組和散列來描述要加載的關聯。

有你的解釋。

+0

我試圖做這樣的事情,但'sale_items'中沒有'vendor_id'列。數據庫需要查看'sale_items'中的'item_id'列,然後在'items'表中查看該商品的'vendor_id'列,並從相關供應商處獲得'name'值。 – clem 2011-06-16 16:55:37

+0

答案已經被編輯了一個可能的解決方案。對不起,我無法在工作中自己查看。 – Luke 2011-06-16 17:09:11

+0

就是這樣!我不知道我是如何度過這麼長時間的搜索,卻從未發現過的。它在哪裏? – clem 2011-06-17 18:07:57

0

你是否真的需要你的sale_items按照數據庫排序,或者你是否等待,直到它呈現出來,並通過javascript排序客戶端(有一些偉大的排序庫) - 這將節省服務器CPU和(後端)代碼複雜度。

+0

我想在服務器上排序,因爲這些項目也會分頁,如果不顯示,我不想加載整個數據集。 – clem 2011-06-16 16:53:25