我试图有选择地对模型强制执行验证。我希望模型在从用户输入数据时强制执行它们,但是在运行文件时我想有时忽略验证。当我从Web用户添加时,我提出了一种将布尔值设置为TRUE的智能方法。看起来很棒,直到我需要从文件更新,现在我基本上必须在所有记录上切换布尔值。以下是我的一些代码:
class Identity < ActiveRecord::Base
validate :validate_spouse_age, :if => "web_add?"
validates :ssn, length: { is: 9 }
def validate_spouse_age
if (relationship == "S" || relationship == "DP") && !dob.nil? && web_add? && age<16
errors.add(:dob, :spouse_under_age)
end
true
end
end
因此,在网络表单上,我只需添加一个hidden_fiedl设置&#39; web_add&#39;为true,验证运行并保存到记录中。但是现在当我想运行以下内容时,我必须将布尔值设置为false,否则验证仍会运行。
identity.web_add=false #to allow it to be updated without validation fails
identity.update_attributes!(
namefirst: line.FIRST_NAME,
namelast: line.LAST_NAME
)
我确信有一种更聪明的方法可以做到这一点。为什么我不仅完全忽略验证,还是有一些我想要运行的验证,无论数据源是什么。例如,SSN需要存在或者应该失败。
任何帮助都会更受欢迎!!!
答案 0 :(得分:1)
您可以跳过整个&#39; web_add&#39;布尔值并在非Web方法中使用update_attribute
方法。您将需要单独更新每个属性,但它将跳过验证并将更改提交到数据库。你可以实现类似的东西:
instance.update_attribute(name, value)
在你的情况下
identity.update_attribute(:namefirst, line.FIRST_NAME)
identity.update_attribute(:namelast, line.LAST_NAME)
当网络用户提交表单时,验证将正常运行。运行update_attribute
方法时,将跳过验证。
此处列出了skip activerecord validations可用的所有方法:
decrement!
decrement_counter
increment!
increment_counter
toggle!
touch
update_all
update_attribute
update_column
update_counters