2010-06-22 41 views
0

我們有一個ActiveRecord模型,其列具有一些默認值。它也有一個驗證條件,如果'profile'屬性被設置爲一個不同的值,那麼默認值是無效的。是否可以確定是否設置了ActiveRecord屬性,而不是默認設置?

我希望能夠確定是否已將屬性設置爲,因爲它們被設置爲默認,以便我可以在驗證之前將它們重置爲新的有效值。

這可能嗎?

更新:我不清楚我的意思,所以我應該給代碼示例。

表的定義是這樣的:

t.column :profile, :string 
t.column :contact_by, :string, :default => "phone", :null => false 

驗證是這樣的:

validate :validate_contact_by_for_profile1 
def validate_contact_by 
    if (profile == "profile1") && (contact_by != "email") 
    errors.add(:contact_by, " must be 'email' for users in profile1") 
    end 
end 

因此,任何時候我們這樣做:

u = User.new 
u.profile => profile1 

我們結束了u無效。我最終想要的是用戶的contact_by默認爲「電話」,但如果他們的個人資料被設置爲profile1,那麼它將更改爲「電子郵件」,除非在此期間已將其設置爲某種內容。 (理想情況下這包括將其設置爲「手機」)

+0

如何這些默認值設定?在保存之前,您可以確定是否更改了值,但這取決於您如何設置默認值。它不應該在gui方面解決嗎?選擇不同的配置文件,字段應該變爲空/重置? – nathanvda 2010-06-22 16:25:47

+0

默認值來自數據庫中的表格。gui-side解決方案在單元測試中不會幫助我。 – Simon 2010-06-22 16:27:32

回答

0

EDITED答: 好,不知道是不是我理解,但我會嘗試:P

,你可以寫一個方法來ovveride輪廓= 二傳手

def profile=(value) 
    self.contact_by = 'email' if value == 'profile1' 
    super 
end 

這樣的工作,你希望:

> n = YourModel.new 
=> #<YourModel id: nil, profile: nil, contact_by: "phone", ...> 
> n.profile = 'profile2' 
=> "profile2" 
> n.contact_by 
=> "phone" 
> n.profile = 'profile1' 
=> "profile1" 
> n.contact_by 
=> "email" 

,你可以看到,這樣你希望你W¯¯螞蟻。那麼你可以做任何你需要的驗證。

希望這一次幫助;-)

OLD答: 通常,你DB遷移過程中設置的默認值。所以當你試圖保存一些數據時,ActiveRecord模型有空白數據,然後當保存在數據庫時,它會得到默認值。

根據這一點,你可以驗證模型使用像這樣玩:

validates_presence_of :some_field, :if => Proc.new {|m| p.profile != <default value>} 

或者,你可以寫一個自定義的驗證碼,爲私有方法,將從驗證被稱爲:

validate :your_custom_validation_method, :if => Proc.new {|m| p.profile != <default value>} 

順便說一句,我建議你看看ActiveRecord的驗證文檔:http://guides.rails.info/active_record_validations_callbacks.html

+0

謝謝 - 看起來我需要更好地解釋我的問題。我會去的。 – Simon 2010-06-23 09:20:58

+0

好的,查看我的新回覆;) – 2010-06-23 13:05:37

相關問題