2011-08-23 29 views
8

Tôi có một câu hỏi liên quan đến hiệp hội kỷ lục hoạt động, đề cập đến phần này của tài liệu ray:Làm thế nào để cư trường trong một has_many thông qua tham gia bảng

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

nếu chúng ta có ba mô hình:

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 

Tài liệu nói rằng việc thu thập các mô hình tham gia có thể được quản lý thông qua api theo cách này:

physician.patients = patients 

nhưng nếu mô hình cuộc hẹn, như trong ví dụ được liên kết, có trường được gọi là cuộc hẹn và tôi muốn tạo cuộc hẹn mới cho Bác sĩ và Bệnh nhân vào một ngày cụ thể? Đoạn mã sau sẽ tạo một bản ghi trong bảng cuộc hẹn, nhưng cách điền địa chỉ cuộc hẹn trong bước thứ ba?

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

có điều gì đó như vậy không?

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

Tôi cũng đang gặp sự cố này ... Tôi muốn thay đổi giá trị mặc định trên thuộc tính trong bảng nối, nhưng chỉ khi tạo bản ghi được liên kết (ví dụ: nếu bệnh nhân được tạo, hãy đặt cuộc hẹn thời gian, nhưng trong các tình huống khác, chúng tôi sẽ chỉ thực hiện các cuộc hẹn mới). – wulftone

Trả lời

4

câu hỏi cũ, nhưng bạn phải trả lời - mặc dù bạn có thể chỉ định trực tiếp cho physician.patients với phương thức <<, nó tạo cuộc hẹn không có giá trị, có thể có hoặc không hợp lệ tùy thuộc vào quy tắc kinh doanh. Vì vậy, cách thông thường hơn để tạo liên kết sẽ là xây dựng cuộc hẹn trên một trong số họ

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

bạn có thể kết hợp các dòng 2 và 3 tất nhiên nếu bạn nghiêng.

dòng trong tài liệu bạn tham khảo

physician.patients = patients 

Tôi nghĩ rằng trường hợp sử dụng hẹp cho rằng có thể là, nếu Demento có 7 bệnh nhân nhưng mất bà Holloway do một sự cố đáng tiếc với một thí nghiệm chết ray thì bạn có thể làm điều này với danh sách 6 bệnh nhân còn lại và các cuộc hẹn của họ sẽ được bảo tồn, và các cuộc hẹn trước đây của bà Holloway sẽ tự động bị xóa (để xóa bất kỳ hồ sơ nào ở đây, vì lý do bảo hiểm trách nhiệm? rất dastardly).

2

Bạn muốn xem xét các tuyến đường lồng nhau, ví dụ:

resources :physicians do 
    resource :patients 
end 

Các bạn có thể sử dụng những thứ như form_for(@physician, @patient)

và url như physician/1/patient/23

để cập nhật một bệnh nhân trong bối cảnh của một bác sĩ.

+0

cảm ơn bạn đã trả lời, nhưng đó không phải chính xác những gì tôi đang tìm kiếm – Gnagno

Các vấn đề liên quan