2014-12-03 65 views
0

我有兩個模型。類別和照片。每個類別都有很多照片。基於另一個模型屬性排序 - Ruby

我想訂購一個類別對象數組,以便它由照片模型中的屬性排序。具體來說,下載照片的次數。

我試圖啓動與一些實例變量像

@category = Category.active.order('photos.qty_download DESC) 

我然後使用該實例變量列出類別和多少張照片已經被下載爲每個類別

Chicago 45 
San Fran 32 
Boston 23 
etc 

什麼表達式可以在Rails中工作?

感謝

回答

2

讓我們假設你的模型看起來像這樣:

class Category < ActiveRecord::Base 
    has_many :photos 
end 

class Photo < ActiveRecord::Base 
    belongs_to :category 
end 

我們還假設:

  • 每張照片都有一個qty_download場,你在你的 問題
  • 描述
  • 每個類別有一個name字段
  • 的目標是根據 訂購類別的顯示的所有qty_download的所有照片中每個 類別的總和
  • 也沒關係完全排除沒有相關照片類別

有了這些假設,你應該能夠編寫

Category. 
    joins(:photos). 
    group("categories.id, categories.name"). 
    select("categories.id, categories.name, sum(photos.qty_download) as total_downloads"). 
    order("total_downloads desc") 

需要注意的是什麼將返回將「相提並論tial「類別對象僅包含id,nametotal_downloads。如果您需要其他類別字段,請將它們添加到groupselect子句中。

更新

較新的Postgres版本允許查詢的簡化:

Category. 
    joins(:photos). 
    group("categories.id"). 
    select("categories.*, sum(photos.qty_download) as total_downloads"). 
    order("total_downloads desc") 

注意,在最新版本的Postgres,你可以簡單地通過一個唯一的ID羣 - 你不再必須按照您選擇的所有屬性來分組。所以你現在可以包含所有類別的屬性categories.*。我會保留原來的版本(稍微)更高效,並向後兼容舊版Postgres。

+0

而如果你想從類別中的所有領域,做到: 選擇(「類別*,SUM(照片。qty_download)AS times_downloaded「) 我認爲只需按」categories.id「進行分組就足夠了 – Humza 2014-12-03 09:05:17

+0

至少對於Postgres來說,當您使用group時,'select'子句中的所有內容都必須出現在'group by'子句中或者是一個聚合函數,所以你的建議都不會起作用YMMV與其他數據庫 – 2014-12-03 09:11:10

+0

你是正面的嗎?因爲我在mysql上運行了原始文件,但是現在我在使用postgres的rails項目中,導軌控制檯: 'Model1.limit(1).joins(:model2s).group(「#{Model1.table_name} .id」)。select(「#{Model1.table_name}。*,SUM(# Model2.table_name} .id)AS mgids「) – Humza 2014-12-03 09:41:02

0
Category.includes(:photos).order(qty_download: :desc).reference(:photos) 
+0

這不起作用,因爲沒有'total_downloads'列。 (另外,你可能的意思是'references'而不是'reference'。) – 2014-12-04 21:35:52

+0

對它做些什麼以及它爲什麼有效的評論會讓答案更有用。 – Trilarion 2014-12-09 14:15:31

相關問題