рельсы активных записей ассоциаций sql поведения - PullRequest
0 голосов
/ 13 октября 2011

У меня есть 2 модели:

# models/car.rb
class Car < ActiveRecord::Base
  belongs_to :model
end

и

# models/manufacturer.rb
class Manufacturer < ActiveRecord::Base
  has_many :cars
end

Когда я выполняю команду в консоли rails Car.find(1).manufacturer, это показывает, что был выполнен еще один sql-запрос SELECT manufacturers.* FROM manufacturers WHERE manufacturers.id = 54 LIMIT 1,

поэтому меня интересует, является ли это обычным (в первую очередь производственным) поведением, когда много SQL-запросов выполняется только для получения какого-либо свойства объекта? а как насчет производительности?

ОБНОВЛЕНИЕ, ОТВЕТ: Я получил ответ из другого источника: мне сказали, что это «необходимое зло» в качестве платы за абстракцию

1 Ответ

2 голосов
/ 14 октября 2011

Это не «необходимое зло», и ваша интуиция в том, что второй запрос не нужен, верна.Что вам нужно сделать, это использовать :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

Однако вы не должны этого делать, если вам не нужен соответствующий Производитель каждый раз, когда вы показываете запись автомобиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...