2012-05-15 2 views
1

Предположим, я вызываю следующие модели:Rails 3 Вложенный запрос избежать SQL

class Foo < ActiveRecord::Base 
    belongs_to :bar 
end 

class Bar < ActiveRecord::Base 
    belongs_to :a 
    belongs_to :b 
end 

Я хочу, чтобы найти все Foos, в том числе Bar и группировки по a_id и b_id.

Я уверен, что следующий запрос будет работать:

Foo.joins(:bar).group('bar.a_id, bar.b_id').all 

мне интересно, если есть способ сделать это без написания SQL в группе заявление?

Sub вопрос

Что называется этот стиль запроса и где я могу прочитать полную документацию о нем? В руководстве по запросам рельсов имеется несколько стилей, и он не содержит подробных сведений о любом из них.

ответ

1

Смешение стилей связано с тем, что стили, использующие хеши, в настоящее время не могут описывать все возможные SQL-запросы. Таким образом, всегда существует отказ от использования строк.

Запрос, который вы дали, и нет причин, по которым его не следует использовать, поскольку строка является очень стандартным SQL и не должна терпеть неудачу, если используется другая база данных.

Можно, однако, написать его без строчек.

Обратите внимание, что ваш текущий запрос, как указано, вызовет ошибку, поскольку по умолчанию выбраны все поля Foo - однако с группой вы можете выбирать только агрегатные функции или группу по столбцам.

Запрос будет что-то вроде:

Foo.select("COUNT(*) as count").joins(:bar).group([:bar => :a_id, :bar => :b_id]) 

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

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