2013-07-31 1 views
0

У меня есть следующие модели:рельсы: граф и группа соединяемых таблиц

Car: 
has_many :car_classes 

CarClass: 
belongs_to :Car 
belongs_to :CarMainClass 

CarMainClass: 
has_many :car_classes 

То, что я хочу сделать, это подсчитать количество автомобилей в CarClass сгруппированных по car_main_class_id, но затем, связанный с main_class_symbol, который в CarMainClass.

Запрос У меня сейчас:

CarClass.group(:car_main_class_id).count(:car_id) => {43=>79, 45=>4 ...} 

Что почти то, что я хочу, за исключением того, что я в конечном итоге только с: car_main_class_id, которые я быть: main_class_symbol от CarMainClass:

{"A1"=>79, "A2"=>4 ...} 

Я попытался присоединиться к таблицам и настраивать параметры, но они не сработали.

Можно ли это сделать в запросе, в котором я не должен снова повторять основные классы?

Большое спасибо за вашу помощь!

+0

Ваши названия моделей не очень хорошие. Может ли CarMainClass лучше назвать CarCompany (или что-то подобное)? – Tom

+0

Эй, Том, я знаю, спасибо за совет. Я действительно переименовал их в этот вопрос, чтобы сделать их более универсальными. – Sobremesa

ответ

1

Вместо того, чтобы иметь подход SQL и использовать «count/group by», вы должны посмотреть на очень простую функцию Rails ActiveRecords: столбец counter_cache.

Например, вы можете добавить столбец «car_classes_count» в CarMainClass, и в классе CarClass, вы делаете так:

CarClass: 
belongs_to :car 
belongs_to :car_main_class, :counter_cache => true 

Вы можете сделать то же самое с колонке «car_class_count» в автомобиле.

Я не знаю, может ли это помочь, но у меня были такие же проблемы, когда я начал разрабатывать Rails. Я пытался сделать некоторые безуспешные сумасшедшие SQL-запросы (запросы, которые работали с sqlite, но не w/postgres), и я, наконец, выбираю другой подход.

+0

Спасибо человеку. Я действительно только начал с рельсов, я не знал, что могу использовать его для этой цели! – Sobremesa

0

Попробуйте это:

CarClass.includes(:car_main_class => :car_classes) 
.group(:car_main_class_id).map { |cc| 
    { cc.car_main_class.main_class_symbol => cc.car_main_class.cars.size } 
} 

Хотя это довольно некрасиво - я согласен с @tom, что вы должны попытаться думать о более значимых имен классов.

+0

Спасибо Thilo! это сработает! Теперь я понимаю, что нет никакого запроса, в котором вы не пробиваете результаты. Встречный наличный доход кажется хорошим ответом. – Sobremesa