2017-02-18 9 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する方法がわかりませんこのクエリを企業の属性の配列の代わりに

の代わりに設定します。

+0

同じ会社名を持っていますか? (私はあなたが名前とIDでグループ化する必要がある理由を理解しようとしています) –

+0

@Joel_Blum、私は持っていません。このクエリの結果として、IDと名前を持つハッシュが必要になります。なぜなら、あとで配列のインデックスから値を取得するのではなく、そのような構造体から値を取得する方が簡単で読みやすくなるからです。 – komarek

答えて

2

これは、モデルに別の関連付けを追加することによって容易に行うことができます。

:あなたは、あなたがこのような何かを見ることができます companies.first言えば

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

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

その後、あなたはこれを行うことができます

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

orders_countのようには見えません。しかし、実際には既にロードされています。あなたはこのようにそれを得ることができます:

companies.first.orders_count 

あなたはハッシュに会社を変換する場合にも、それを見ることができます:Postgresので

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

少なくとも、あなたは、よりデータを取得したい場合属性ハッシュの場合は、select文字列内の各列を個別に指定する必要があります。他のデータベースについてはわかりません。