6
在Rails 3中,它們是相同的還是不同的?他們有什麼不同?Rails 3:懶惰加載與急切加載
o = Appointment.find(297)
o.service
o = Appointment.includes(:service).find(297)
o.service
在Rails 3中,它們是相同的還是不同的?他們有什麼不同?Rails 3:懶惰加載與急切加載
o = Appointment.find(297)
o.service
o = Appointment.includes(:service).find(297)
o.service
我不知道,但它看起來像你在Appointment
類belongs_to :serivce
和has_many :appointments
的Service
類。正確?
在這種情況下,您的兩個示例之間不會有任何區別。 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)