2010-06-22 80 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

相关问题