Ruby on rails 是否可以确定是否已将ActiveRecord属性设置为默认值以外的其他属性?

Ruby on rails 是否可以确定是否已将ActiveRecord属性设置为默认值以外的其他属性?,ruby-on-rails,ruby,activerecord,default-value,Ruby On Rails,Ruby,Activerecord,Default Value,我们有一个ActiveRecord模型,它的列有一些默认值。它还有一个验证条件,如果“profile”属性设置为不同的值,则默认值无效 我希望能够确定属性是否已设置,因为它们已设置为默认值,以便在验证之前将它们重置为新的有效值 这可能吗 更新:我不清楚我的意思,所以我应该给出代码示例 该表的定义如下: t.column :profile, :string t.column :contact_by, :string, :default => "phone", :null => fals

我们有一个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
validates_presence_of :some_field, :if => Proc.new {|m| p.profile != <default value>}
验证如下所示:

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
validates_presence_of :some_field, :if => Proc.new {|m| p.profile != <default value>}
因此,无论何时我们这样做:

u = User.new
u.profile => profile1
我们以你无效而告终。最后我想说的是,用户的联系人默认为phone,但如果他们的个人资料设置为profile1,那么它将更改为email,除非同时设置了其他内容。理想情况下,这包括将其设置为电话

编辑的答案: 好的,我不知道我是否理解,但我会试试:P

您可以编写一个方法来验证profile=setter:

这种方式的效果与您预期的一样:

> 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"
正如你所见,这样你就能得到你想要的。然后你可以做任何你需要的验证

希望这次能有所帮助-

旧答案: 通常,在数据库迁移期间设置默认值。因此,当您尝试保存一些数据时,ActiveRecord模型有空白数据,然后在db上保存时,它会获得默认值

根据这一点,您可以使用以下内容在模型中进行验证:

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
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>}

顺便说一句,我建议您查看ActiveRecord验证文档:

这些默认值是如何设置的?在保存某个值之前,您完全可以检查该值是否已更改,但这取决于您如何设置默认值。这不是应该在gui端解决吗?选择其他配置文件,字段应变为空/重置?默认值来自数据库中的表。gui端解决方案在单元测试中对我没有帮助。谢谢-看起来我需要更好地解释我的问题。我要试一试。