In Rails 3, sind diese gleich oder anders? Wie unterscheiden sie sich?Schienen 3: Lazy Loading versus Eager Loading
o = Appointment.find(297)
o.service
o = Appointment.includes(:service).find(297)
o.service
In Rails 3, sind diese gleich oder anders? Wie unterscheiden sie sich?Schienen 3: Lazy Loading versus Eager Loading
o = Appointment.find(297)
o.service
o = Appointment.includes(:service).find(297)
o.service
Ich bin nicht sicher, aber es sieht aus wie Sie belongs_to :serivce
in der Appointment
Klasse und has_many :appointments
die Service
Klasse. Richtig?
In diesem Fall gibt es keinen Unterschied zwischen Ihren 2 Beispielen. Rails 2 Abfragen in beiden Fällen durchführen:
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
Wenn auf der anderen Seite, Sie riefen:
s = Service.find(123)
und dann so etwas wie:
s.appointments.find(1)
s.appointments.find(2)
etc. viele Stellen im Code, dann würde es so viele Anfragen an die Datenbank geben wie die Anzahl dieser Aufrufe (Rails 3 ist hier ziemlich schlau, also wenn Sie s.appointments.each
ausgeführt hätten, würde es tatsächlich alle Termine in einer Abfrage holen) .
In diesem Fall würde es besser sein zu nennen:
s = Service.include(:appointments).find(123)
weil dann Rails nur zwei Abfragen ausführen wird: zum einen die Service
und ein holen alle Termine zu holen:
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)