2011-08-23 16 views
8

Mam pytanie dotyczące aktywnego związku rekord, odnosząc się do tej części dokumentacji poręcze:jak wypełnić pola w has_many poprzez dołączyć tabelę

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

jeśli mamy trzy modele:

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 

Dokumentacja mówi, że kolekcją modeli łączenia można zarządzać za pomocą api w następujący sposób:

physician.patients = patients 

Ale co, jeśli model spotkania, podobnie jak w połączonym przykładzie, ma pole o nazwie date_zatrzymania i chcę utworzyć nową wizytę, biorąc pod uwagę lekarza i pacjenta w określonym dniu? Poniższy kod spowoduje utworzenie rekordu w tabeli spotkań, ale w jaki sposób wypełnić również termin appointment_date w trzecim kroku?

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

Czy coś takiego istnieje?

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

Używam również tego problemu ... Chcę zmienić domyślną wartość atrybutu w tabeli łączenia, ale tylko wtedy, gdy zostanie utworzony powiązany rekord (na przykład, jeśli zostanie utworzony pacjent, ustaw termin czas, ale w innych sytuacjach umawialiśmy się na nowe spotkania). – wulftone

Odpowiedz

4

stare pytanie, ale należy odpowiedzieć - chociaż można przypisać bezpośrednio do physician.patients metodą <<, tworzy spotkanie bez wartości, które mogą lub nie mogą być ważne, w zależności od reguł biznesowych. Więc tym bardziej zwykły sposób, aby utworzyć stowarzyszenie byłoby zbudować spotkanie na jednej z nich

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

można połączyć linie 2 i 3 Oczywiście jeśli jesteś tak skłonny.

linia w docs polecisz do

physician.patients = patients 

myślę wąski przypadku użycia do tego może być, jeśli Demento miała 7 pacjentów, ale traci pani Holloway z powodu nieszczęśliwego wypadku z eksperymentu śmierć ray , mógłbyś to zrobić dzięki zaktualizowanej liście 6 dotychczasowych pacjentów i ich spotkania zostałyby zachowane, a przeszłe spotkania pani Holloway zostaną automatycznie usunięte (aby usunąć wszelkie zapisy tutaj z powodów związanych z ubezpieczeniem od odpowiedzialności? być tak nikczemnym).

2

Chcesz rozważyć trasy zagnieżdżone, np.

resources :physicians do 
    resource :patients 
end 

można używać rzeczy jak form_for(@physician, @patient)

i url jak physician/1/patient/23

za aktualizowanie pacjenta w kontekście lekarza.

+0

dziękuję za odpowiedź, ale nie jest to dokładnie to, czego szukam – Gnagno

Powiązane problemy