En Rails 3, ¿son iguales o diferentes? ¿Cómo difieren?Rails 3: carga lenta frente a carga ansiosa
o = Appointment.find(297)
o.service
o = Appointment.includes(:service).find(297)
o.service
En Rails 3, ¿son iguales o diferentes? ¿Cómo difieren?Rails 3: carga lenta frente a carga ansiosa
o = Appointment.find(297)
o.service
o = Appointment.includes(:service).find(297)
o.service
No estoy seguro, pero parece que tiene belongs_to :serivce
en la clase Appointment
y has_many :appointments
la clase Service
. ¿Correcto?
En ese caso, no habrá ninguna diferencia entre los 2 ejemplos. Raíles ejecutarán 2 consultas en ambos casos:
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
Si, por el contrario, usted llamaba:
s = Service.find(123)
y luego hacer algo como:
s.appointments.find(1)
s.appointments.find(2)
etc. muchos lugares en el código, entonces habría tantas consultas a la base de datos como el número de estas llamadas (Rails 3 es bastante inteligente aquí, así que si ejecutó s.appointments.each
, realmente recuperaría todas las citas en 1 consulta) .
En ese caso, sería mejor llamar:
s = Service.include(:appointments).find(123)
porque entonces rieles ejecutará sólo 2 consultas: uno a buscar el Service
y uno a buscar todas las citas:
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)