2012-05-31 54 views
0

在我的應用程序中,我有三種感興趣的模型。第一種是患者模型,它具有記錄模型。同樣,記錄模型has_many診斷模型。起初我有患者模型通過訪問診斷:在Rails中可能會使用模型的多態關聯3

:has_many :diagnoses, :through => :records 

但是我有這個問題是我也希望患者模型,以便能夠建立一個診斷對象的獨立記錄模式的。例如,在入院期間,患者可能被診斷出患有新病症。不過,她也可能有病史(先前的診斷),所以我想跟蹤這一點,而不必訴諸於創建新模型。

我試着使用多態關聯描述here,這樣我的模型看起來像:

class Patient < ActiveRecord::Base 
    has_many :records 
    has_many :diagnoses, :as => :medical_history 
    # ... 
end 

class Record < ActiveRecord::Base 
    belongs_to :patient 
    has_many :diagnoses, :as => :medical_history 
    # ... 
end 

class Diagnosis < ActiveRecord::Base 
    belongs_to :medical_history, :polymorphic => true 
    # ... 
end 

我遇到的問題是,雖然我可以成功地通過記錄對象創建診斷對象,當我打電話p.diagnoses(其中p是Patient對象),它不允許我訪問所有診斷對象,就像我期望的那樣。

重申,我想要的是能夠通過Record模型或Patient模型創建Diagnosis對象,但能夠讓Patient模型訪問通過自身創建的所有Diagnosis對象或通過Record模型(這應該是可能的,因爲Record模型屬於Patient模型)。

我很確定這是我不真正瞭解多態關聯是如何工作的,我可能完全濫用多態關聯。所以我感謝所有的幫助。謝謝!

回答

1

我認爲你使用多態是合適的。

通過記錄創建的診斷(在此上下文中是一個令人困惑的術語,因爲它可能意味着患者記錄或數據庫記錄)不會自動添加到患者。你需要做兩件事情之一:

  1. 使用回調(例如,after_save的)你的記錄模式,添加所有診斷到Record.patient並調用Record.patient.save。請注意,您的患者可能也有回調,所以要小心他們不要互相呼叫。

  2. 在Patient中添加一個方法,以便在需要時將p.diagnoses與p.records.diagnoses組合使用。正如(未測試的代碼):

    def diagnoses_all 
        // you could memoize this if so inclined 
        (diagnoses + records.collect{|r| r.diagnoses}.flatten).uniq 
    end 
    

在這兩種情況下,你可以隨時撥打Patient.records.diagnoses,讓知識不會丟失。但是,在第一種情況下,如果您想知道哪些診斷是通過Patient創建的,則必須編寫另一種方法來基本反轉diagnoses_all,即從Patient.diagnoses中減去Patient.records.diagnoses。

爲了更好地理解發生了什麼,請查看爲3個表生成的(假設SQL)模式。在控制檯中,實例化Patient,調用p.diagnoses和p.records.diagnoses,觀察生成的SQL的日誌。

+0

感謝pduey,我已經得到了這個工作使用類似於你的第二個選項 - 這只是很高興知道我並沒有完全脫離使用多態關聯標記(儘管如果有人不同意我很高興聽到爲什麼)。 – oort