2017-02-18 17 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

НО я не знаю, как ча nge этот запрос должен иметь

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

вместо массива атрибутов Компании.

+0

У вас есть разные компании с тем же именем? (я пытаюсь понять, почему вам нужно группировать имя и идентификатор) –

+0

@Joel_Blum, Нет. У меня нет. Я просто хочу иметь в результате этого запроса хэш с идентификатором и именем, потому что позже он будет проще и читабельнее получить какое-то значение из такой структуры, а не получать значения через индекс массива. – komarek

ответ

2

Это можно сделать проще, добавив еще одну ассоциацию с моделью:

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

Тогда вы можете сделать это:

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. Я не уверен в других базах данных.

 Смежные вопросы

  • Нет связанных вопросов^_^