2017-02-18 52 views
1

鑑於這種模型關係:Rails的查詢與嵌套協會和組(按相關對象)

orders.rb 
belongs_to user 

user.rb 
belongs_to company 

company.rb 
has_many users 

我想指望每家公司的所有訂單,所以我得到了這一點:

Order.joins(user: :company) 
.group(['companies.name, companies.id]) 
.count 

其結果是

[ 「公司1」,1] => 123

,但我不知道如何CHA如果此查詢具有

<Company id: 1,name: "Jim Beam"> => 5 

而不是公司的屬性數組。

# company.rb 
has_many :users 
has_many :orders, through: :users 

然後,你可以這樣做::

+0

你有不同的公司有同名嗎? (我試圖理解你爲什麼需要在名稱和ID上分組) –

+0

@Joel_Blum,不,我沒有。我只是希望這個查詢的結果是一個帶有id和name的散列,因爲稍後它會更容易和更具可讀性,以便從這樣的結構獲得一些值,而不是通過數組的索引獲取值。 – komarek

回答

2

這可以通過添加另一個關聯的模型變得更容易

companies = Company. 
       joins(:orders). 
       group("company.id"). 
       select("company.id, company.name, count(orders.id) as orders_count") 

如果你然後說companies.first你會看到這樣的事情:

#<Company:0x005610fa35e678 id: 15 name: 'foo'> 

它看起來不像orders_count那裏。但它實際上已經被加載。你可以在它是這樣的:

companies.first.orders_count 

你也可以看到它,如果你的公司轉換爲哈希:

companies.first.attributes # => { id: 15, orders_count: 2, name: "foo" } 

在Postgres裏至少,如果你想獲得更多的數據屬性散列,您必須單獨指定select字符串中的每個列。我不確定其他數據庫。