Это не «необходимое зло», и ваша интуиция в том, что второй запрос не нужен, верна.Что вам нужно сделать, это использовать :include
/ includes
, чтобы поручить Rails сделать JOIN
для получения связанных объектов в том же SELECT
.Таким образом, вы могли бы сделать это:
Car.find 1, :include => :manufacturer
# or, in Rails 3 parlance:
Car.includes(:manufacturer).find 1
Rails называет это «нетерпеливой загрузкой», и вы можете узнать больше об этом в документации (прокрутите вниз или нажмите Ctrl + F для «Стремительной загрузки»связей ").
Если вы всегда хотите загружать связанные объекты, вы можете объявить default_scope
в вашей модели:
class Car
belongs_to :manufacturer
default_scope :include => :manufacturer
# or Rails 3:
default_scope includes(:manufacturer)
end
Однако вы не должны этого делать, если вам не нужен соответствующий Производитель каждый раз, когда вы показываете запись автомобиля.