是否可以确定是否已设置ActiveRecord属性,而不是默认属性?

时间:2010-06-22 12:23:48

标签: ruby-on-rails ruby activerecord default-value

我们有一个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”,除非在此期间已将其设置为某个内容。 (理想情况下,这包括将其设置为“电话”)

1 个答案:

答案 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