2 votes

Interroger une association de type many-to-many dans Rails

Je suis en train d'apprendre Rails et je suis bloqué avec une requête. Mes modèles ont une relation de type many-to-many. Il est difficile d'expliquer les modèles que j'utilise car ils sont trop spécifiques à mon domaine de travail, je vais donc utiliser l'exemple du guide rails avec une légère modification.

Voici le modèle:

class Physician < ActiveRecord::Base
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ActiveRecord::Base
  attr_accessor :appointment_time

  belongs_to :physician
  belongs_to :patient
end

class Patient < ActiveRecord::Base
  attr_accessor :name, :age

  has_many :appointments
  has_many :physicians, through: :appointments

Je veux une liste des patients avec leur Appointment.appointment_time. Je peux lister tous les patients associés à un médecin en utilisant physician.patients. Comment puis-je inclure l'heure de rendez-vous également ? Je peux penser à interroger les rendez-vous une fois que j'ai la liste des patients, mais je me demande s'il existe une façon "rails" pour faire cela (quelque chose comme physician.patients_with_appointments). Sinon, quelle est la manière efficace de faire cela ?

2voto

Shawn Points 250
physician.appointments.includes(:patients).each do |appointment|
  puts appointment.appointment_time
  puts appointment.patient.name
end

**Ceci n'est pas testé

Autant que je sache, la manière Rails que vous recherchez n'existe pas vraiment. Pour vous assurer de ne pas charger chaque élément à chaque boucle, vous pouvez utiliser un includes. Je ne suis pas sûr si je place les includes au bon endroit car je n'ai pas accès à la console Rails pour le moment.

S'il y a beaucoup d'enregistrements, vous voudrez peut-être faire une recherche par lots en utilisant find_each, mais pour votre exemple, cela devrait fonctionner.

0voto

Shane Points 58

Comme l'a dit phil.ts :

patients = physician.patients.include(:appointments)

fera l'affaire.

Maintenant, lorsque vous faites :

patients.appointment

la base de données n'aura pas besoin d'une requête supplémentaire car Rails sait de les inclure dans la première requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X