如何在导入数据时跳过特定的模型验证?
例如,假设我有这个模型:
class Account
validates :street_address, presence: true
end
通常情况下,我不希望在没有地址的情况下保存帐户,但我也会从旧系统转换大量数据,而且许多帐户都没有地址。
我的目标是我可以将旧帐户添加到新数据库,但将来,在编辑这些帐户时,必须添加街道地址。
正如我所说,我想跳过特定的验证;其他人应该仍然运行。例如,根本不应将没有帐号的帐户加载到新系统中。
答案 0 :(得分:6)
这应该有效:
class Account
attr_accessor :importing
validates :street_address, presence: true,
unless: Proc.new { |account| account.importing }
end
old_system_accounts.each do |account|
# In the conversion script...
new_account = Account.new
new_account.importing = true # So it knows to ignore that validation
# ... load data from old system
new_account.save!
end
答案 1 :(得分:1)
如果您只打算进行一次转换(即,在导入旧数据后您不需要再次执行此操作),您可以skip validations保存导入的记录而不是修改您的应用以支持它。
new_account.save validate: false
答案 2 :(得分:0)
请注意
account.update_attribute(:street_address, new_address)
也会跳过验证。 #update_attributes(注意's')运行验证,其中update_attribute(singular)没有。