2011-08-23 85 views
8

我有一個關於活動記錄相關聯的問題,指的是軌道文檔的這一部分:中的has_many如何填充字段通過連接表

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

如果我們有三種型號:

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 

該文檔指出,可以通過api以這種方式管理加入模型的集合:

physician.patients = patients 

但如果約會模型(如鏈接示例中)有一個名爲appointment_date的字段,並且我想在特定日期爲醫生和患者創建新約會,該怎麼辦? 以下代碼將在約會表中創建一條記錄,但是如何在第三步中填充appointment_date?

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

做了這樣的事情嗎?

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

我也遇到了這個問題...我想更改連接表中某個屬性的默認值,但僅當創建相關記錄時(例如,如果創建了Patient,則設置約會時間,但在其他情況下,我們只是新的約會)。 – wulftone

回答

4

老問題,但應該回答 - 雖然你可以用<<方法直接分配給physician.patients,它創建一個沒有價值,取決於業務規則可能會或可能不會是有效的預約。因此,更常見的方式來創建該協會將建立在其中一個

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

預約,如果你願意的話,你可以結合線2,當然3。

在你提到的

physician.patients = patients 

我認爲狹窄的使用情況可能是,如果Demento有7名患者,但失去霍洛威夫人文檔行由於一個不幸的事件與死亡射線實驗,那麼你可以用6個現存病人的最新清單來做到這一點,他們的任命將被保留,並且霍洛威夫人的過去任命將被自動刪除(爲了責任保險的原因,爲了刪除這裏的任何記錄?只有Demento會太卑鄙了)。

2

您希望考慮嵌套的路線,例如,

resources :physicians do 
    resource :patients 
end 

的,你可以使用之類的東西form_for(@physician, @patient)

和URL的喜歡physician/1/patient/23

對醫生的上下文中更新患者。

+0

謝謝你的回答,但那不是我正在尋找的東西 – Gnagno

相關問題