我们有一个ActiveRecord模型,其列有一些默认值。它还有一个验证条件,如果'profile'属性设置为不同的值,则默认值无效。
我想要的是能够确定属性是否已设置,因为它们已设置为默认,以便我可以在验证之前将它们重置为新的有效值。
这可能吗?
更新:我不清楚我的意思,所以我应该提供代码示例。
表的定义如下:
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默认为“phone”,但如果他们的个人资料设置为profile1,那么它将更改为“email”,除非在此期间已将其设置为某个内容。 (理想情况下,这包括将其设置为“电话”)
答案 0 :(得分:0)
编辑答案: 好吧,不知道我是否理解,但我会尝试:P
你可以编写一个方法来设置profile = setter :
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"
正如你所看到的,这样你就会想要你想要的。那么你可以做任何你需要的验证。
希望这次有所帮助; - )
老答案: 通常,您在db迁移期间设置默认值。所以当你尝试保存一些数据时,ActiveRecord模型有空白数据,然后当保存在db上时,它会得到默认值。
根据这一点,您可以使用以下内容在模型中进行验证:
validates_presence_of :some_field, :if => Proc.new {|m| p.profile != <default value>}
或者,您可以编写自定义验证代码,作为私有方法,将从validate:
调用validate :your_custom_validation_method, :if => Proc.new {|m| p.profile != <default value>}
btw我建议您查看ActiveRecord验证文档:http://guides.rails.info/active_record_validations_callbacks.html