Как использовать включения в операторе AREL Rails 3?

Я пытаюсь увидеть SQL позади и оператор AREL:

Brand.where(:subdomain => "coke").includes(:products).to_sql

у бренда есть_много продуктов, и продукт принадлежит бренду.

Однако приведенное выше утверждение дает только:

"SELECT `brands`.* FROM `brands` WHERE `brands`.`subdomain` = 'coke'"

Почему я не вижу информацию для таблицы products в SQL?


person AKWF    schedule 29.06.2011    source источник


Ответы (1)


Когда вы используете оператор includes, Rails сгенерирует отдельный запрос для каждой таблицы (поэтому, если вы включите 2 другие таблицы, всего будет 3 запроса).

Вместо этого вы можете использовать оператор joins, и он объединит все это в один запрос, однако вы можете столкнуться с падением производительности. Кроме того, если любое из ваших where(...) условий запрашивает включенную таблицу, оно будет объединено в один запрос.

См. другой подобный вопрос для получения дополнительной информации. о поведении Rails.

person Dylan Markow    schedule 29.06.2011
comment
Э-э, он не будет генерировать отдельный запрос для каждой таблицы, если в запросе есть условие для ссылки на эту таблицу. Вместо этого он будет использовать LEFT OUTER JOIN и один запрос. - person Ryan Bigg; 30.06.2011
comment
Вот что я сказал... если какое-либо из ваших условий запрашивает включенную таблицу, оно будет объединено в один запрос [вместо выполнения нескольких запросов] - person Dylan Markow; 30.06.2011
comment
Аааа, указание мне на этот другой вопрос действительно заставило меня задуматься, Дилан. Если бы он выполнял JOIN вне включений, он возвращал бы избыточные данные для основного объекта AR. Имеет смысл, спасибо! - person AKWF; 30.06.2011