2011-08-23 10 views
8

Tengo una pregunta sobre la asociación registro activo, en referencia a esta parte de la documentación de rieles:cómo rellenar los campos de un has_many unirse a través de la mesa

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

si tenemos tres modelos:

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

class Appointment < ActiveRecord::Base 
    belongs_to :physician 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    has_many :appointments 
    has_many :physicians, :through => :appointments 
end 

la documentación dice que la colección de unirse a los modelos puede ser gestionado a través de la API de esta manera:

physician.patients = patients 

pero, ¿qué sucede si el modelo de cita, como en el ejemplo vinculado, tiene un campo llamado cita_fecha y quiero crear una cita nueva entre el médico y el paciente en una fecha específica? El siguiente código creará un registro en la tabla de citas, pero ¿cómo llenar la cita_fecha también en el tercer paso?

physician = Physician.first 
patient = Patients.first 
physician.patients << patient 

hace algo como esto existe?

physician.patients.create(:patient => patient, 'appointment.appointment_time' => appointment_time) 
+0

También estoy teniendo este problema ... Quiero cambiar un valor predeterminado en un atributo en la tabla de unión, pero solo cuando se crea un registro asociado (por ejemplo, si se crea un paciente, configure la cita tiempo, pero en otras situaciones solo haríamos nuevas citas). – wulftone

Respuesta

4

pregunta anterior, pero debe responderse: aunque puede asignar directamente al physician.patients con el método , crea una cita sin valores, que puede o no ser válida según las reglas comerciales. Así que la forma más habitual de crear la asociación sería construir el nombramiento de uno de ellos

demento = Physician.find_by_name('Dr. Demento'} 
patient = Patient.new { :name => 'Mrs. Holloway' } 
patient.appointments << Appointment.new { :physician => demento, :appointment_time => appt_time } 

podría combinar las líneas 2 y 3, por supuesto, si usted está tan inclinado.

la línea en los documentos que usted se refiere a

physician.patients = patients 

Creo que el caso de uso estrecho para que pueda ser, si Demento tenía 7 pacientes, pero pierde la señora Holloway, debido a un desafortunado incidente con un experimento rayo de la muerte , entonces usted podría hacer esto con una lista actualizada de los 6 pacientes existentes y se preservarían sus citas, y las citas anteriores de la Sra. Holloway serían eliminadas automáticamente (para borrar cualquier registro de aquí, por razones de seguro de responsabilidad civil, solo Demento lo haría). ser tan cobarde).

2

Quiere considerar rutas anidadas, p.

resources :physicians do 
    resource :patients 
end 

La puedes usar cosas como form_for(@physician, @patient)

y url es como physician/1/patient/23

para la actualización de un paciente en el contexto de un médico.

+0

gracias por la respuesta, pero eso no es exactamente lo que estoy buscando – Gnagno

Cuestiones relacionadas