2014-05-17 104 views
0

我正在使用rails 3.2。我有一個「樣本」的嵌套表單。 「患者」可以有幾個「樣品」,但「樣品」只能有一個「患者」。檢查是否存在記錄,如果是更新,否則創建新的 - 嵌套窗體 - 導軌

患者主鍵是「ID」,但也有4個外鍵:nid,province_id,district_id和facility_id。

這裏的模型(我想只顯示相關代碼):

Patient.rb

class Patient < ActiveRecord::Base 

    attr_accessible :date_of_birth, :infant_name, :nid, :province_id, :district_id, :facility_id, :gender_id, :gender_atributes 

    belongs_to :gender 
    belongs_to :province 
    belongs_to :district 
    belongs_to :facility 
    has_many :samples 

    accepts_nested_attributes_for :gender 

    validates :province_id, presence: true 
    validates :district_id, presence: true 
    validates :facility_id, presence: true 
    validates :nid, presence: true 
    #To validate uniqueness of patient, that is, one with unique nid, province, district and facility 
    validates_uniqueness_of :nid, :scope => [:province_id, :district_id, :facility_id] 

end 

Sample.rb

class Sample < ActiveRecord::Base 
    attr_accessible :dateOfSample, :nrOrdem, :patient_id,:facility_id, :province_id, :district_id 

    belongs_to :facility 
    belongs_to :patient 
    belongs_to :province 
    belongs_to :district 

    accepts_nested_attributes_for :patient 

end 

我想是爲了避免損壞了pacient上的數據,也就是讓不同的患者具有相同的(nid,province_id,district_id和facility_id)。

現在樣本的嵌套形式讓我創建一個新的患者,如果我嘗試創建一個新的患者(nid,province_id,district_id和facility_id),我得到一個錯誤,說「nid已經被採用」。但是,由於患者可能有不同的樣本,我想(在嘗試創建記錄時)檢查患者是否已經存在,如果它確實會將「patient_id」添加到「樣本」記錄中,否則創建一個新的一個。

如果還顯示一條消息,說明病人已經存在並填寫表單上的相應數據,但現在如果它將patient_id添加到樣本記錄中,我會很高興,而忽略其餘部分病人字段嵌套形式。

我試圖實現這樣的東西 rails: create Parent, if doesn't exist, whilte creating child record但它沒有工作。

我該如何解決這個問題?

編輯

下面的代碼是如何結束@詹姆斯·梅森的幫助後。 在Sample.rb

def patient_attributes=(attrs) 
    self.patient = Patient.where({:nid => attrs[:nid], province_id: province_id, district_id: district_id, facility_id: facility_id}).first_or_initialize(attrs) 
end 

回答

2

您正在尋找first_or_create and/or first_or_initialize。在這種情況下,由於您關心記錄是否已經存在,您可能需要初始化版本。

@patient = Patient.where({nid: nid, province_id: province_id, district_id: district_id, facility_id: facility_id}).first_or_initialize 
@show_exists_message = [email protected]_record? 
@patient.save 

您可以把這個代碼在你的控制器的create動作,或者,因爲你使用嵌套的屬性,定義自定義Sample#patient_attributes=方法:

class Sample < ActiveRecord::Base 
    belongs_to :patient 
    accepts_nested_attributes_for :patient 

    def patient_attributes=(attrs) 
    self.patient = Patient.where(attrs).first_or_initialize(attrs) 
    @show_exists_message = [email protected]_record? 
    end 
end 
+0

我會把這個「創建「」樣本「控制器的行爲? – lbramos

+0

更新了關於在哪裏放置代碼 –

+0

的例子,我想我們快到了。我把代碼放在示例模型中,但我必須這樣做:'self.patient = Patient.where({:nid => attrs [:nid],province_id:province_id,district_id:district_id,facility_id:facility_id})。 first_or_initialize'因爲它只搜索這些字段。如果患者已經存在,它可以讓我在樣本記錄中添加「patient_id」,但如果患者不存在,它不會通過患者的其餘部分...如果它不存在,我怎麼能通過其餘的的參數在attrs?謝謝 – lbramos

相關問題