Rails 3: Ленивая загрузка против энергичной загрузки - PullRequest
6 голосов
/ 20 октября 2010

В Rails 3 они одинаковые или разные? Чем они отличаются?

o = Appointment.find(297)
o.service


o = Appointment.includes(:service).find(297)
o.service

1 Ответ

7 голосов
/ 20 октября 2010

Я не уверен, но, похоже, у вас есть belongs_to :serivce в классе Appointment и has_many :appointments в классе Service. Правильно?

В этом случае не будет никакой разницы между вашими 2 примерами. Rails выполнит 2 запроса в обоих случаях:

Appointment Load (0.0ms)  SELECT "appointments".* FROM "appointments" WHERE ("appointments"."id" = 1) LIMIT 1
Service Load (0.0ms)  SELECT "services".* FROM "services" WHERE ("services"."id" = 1) LIMIT 1

Если, с другой стороны, вы звоните:

s = Service.find(123)

и затем сделайте что-то вроде:

s.appointments.find(1)
s.appointments.find(2)

и т.д.. во многих местах в коде к базе данных будет поступать столько же запросов, сколько и количество этих вызовов (здесь Rails 3 довольно умный, поэтому, если вы выполнили s.appointments.each, он фактически выберет все встречи в 1 запросе).

В таком случае было бы лучше позвонить:

s = Service.include(:appointments).find(123)

потому что тогда Rails выполнит только 2 запроса: один для извлечения Service и один для извлечения всех встреч:

Service Load ( 0.0ms )  SELECT "services".* FROM "services" WHERE ("services"."i
d" = 123) LIMIT 1
Appointment Load ( 0.0ms )  SELECT "appointments".* FROM "appointments" WHERE ("
appointments".service_id = 123) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...