2013-10-25 69 views
0

我目前正在通過has_one關聯(設備有一項保修,保修屬於設備)對設備進行保修的項目。除了事實上,我的一位同事向我建議在device_warranty的device_warranty_ends屬性上添加一個存在驗證,以確保至少此字段在設備有保修時已填充,否則一切正常。Rails has_one的驗證並屬於協會

但是,問題是,現在,你不能創建一個沒有保修的設備,這顯然不是一個真實的生活情況,因爲設備可以自然存在沒有保修。所以,我的問題是,只有當device_warranty連接到設備時,我如何才能驗證device_warranty_ends。

換句話說,創建一個設備不應該關心擔保,除非有人實際上對設備附加保修(通過填寫字段),然後只有我應該檢查device_warranty_ends presence:true。

謝謝。

這裏是我當前的驗證代碼:

class DeviceWarranty < ActiveRecord::Base 
belongs_to :device 
validates :warranty_ends_at, presence: true 
end 

class Device < ActiveRecord::Base 
    has_one :device_warranty 
+0

分享您當前的驗證碼。 – cortex

+0

@cortex添加了代碼 – rii

回答

0

你的問題是你使用HAS_ONE的分配保證所有設備對象。您當然可以創建一個「保修」對象,該對象在程序中用於表示設備沒有保修。

如果您的程序要求所有保修屬於設備,您可以在保修期內運行保單結束檢查,以便僅允許創建結束保修。

+0

我該如何做到這一點:「您當然可以創建一個」保修「對象,該對象在程序中用於表示設備沒有保修。聽起來像是一個可行的解決方案。 – rii

0

您可以在Device型號中執行自定義驗證,該型號檢查它是否有保修。

如:

class Device < ActiveRecord::Base 
    validate :warranty_must_exist 

    def warranty_must_exist 
    errors.add(:id, 'warranty must exist') if self.warranty.blank? 
    end 
end 
0

我找到了答案,我的問題使用,拒絕,如果:

accepts_nested_attributes_for :device_warranty, :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank?}}, :allow_destroy => true 

基本上,它拒絕驗證,如果該字段爲空,如果他們是不是它檢查device_warranty_ends是否已填充。

感謝所有試圖幫助我的人。