2017-03-04 44 views
0

我正在建設醫生預約網站。我有用戶模型,我想將它分成兩部分:醫生和患者。我曾嘗試過:從一個模型製作兩個模型

class User < ActiveRecord::Base 
end 

class Appointment < ActiveRecord::Base 
    belongs_to :physician, class_name: "User" 
    belongs_to :patient, class_name: "User"  
    end 

class Physician < User 
    has_many :appointments 
    has_many :patients, through: :appointments, source: "User" 
end 

class Patient < User 
    has_many :appointments 
    has_many :physicians, through: :appointments, source: "User" 
end 

問題:如何獲得physician_id和patient_id列在約會表中? 我選擇了這種方式,因爲當醫師和患者模型分開時,註冊將成爲問題(我認爲是這樣)。

+0

而且你可能想看看單表繼承或STI,因爲它似乎是你正在嘗試做。 – Doon

+0

非常感謝!我感謝您的幫助。 –

回答

0

我認爲你是在正確的道路上,只需要運行遷移以在約會表上添加對醫生和患者的引用。 雖然,您不需要將source屬性添加到病人或醫生has_many,因爲那些將由Rails推斷!

我想我也更喜歡這種有醫師和患者模型的方法,雖然不是用於註冊目的,但是對於單一責任!

讓我知道是否可行

+0

它工作!但我不明白背後的邏輯:inverse_of ... –

+0

你可以找到更多關於'inverse_of'選項的細節[here](https://www.viget.com/articles/exploring-the-inverse-of-期權上軌模型的協會)。基本上,我真正見過的地方是保存相關記錄的時候,例如,如果您正在嘗試爲尚未保存的父級創建子記錄,則會出現父級未保存的錯誤,但是使用inverse_of選項,您可以保存該記錄。您應該刪除Physician和Patient模型中的'source'選項,儘管它顯得多餘 – oreoluwa

0
add_reference :appointments, :patient, foreign_key: true 
add_reference :appointments, :physician, :foreign_key: true 

這兩個遷移應外鍵添加到您的表。不過,查看文檔以確保我的語法絕對正確。

+0

它的幫助和工作。感謝您的幫助... –

0

除了改變dpalazzari建議我相信你會想作以下修改:

class Appointment < ActiveRecord::Base 
    belongs_to :physician, class_name: "Physician", inverse_of: :appointments 
    belongs_to :patient, class_name: "Patient", inverse_of: :appointments  
end 

class Physician < User 
    has_many :appointments, foreign_key: :physician_id, inverse_of: :physician 
    has_many :patients, through: :appointments, source: "User" 
end 

class Patient < User 
    has_many :appointments, foreign_key: :patient_id, inverse_of: :patient 
    has_many :physicians, through: :appointments, source: "User" 
end 
+0

它幫助!感謝你的幫助 –