导入数据时如何跳过特定的模型验证?
例如,假设我有这个模型:
class Account
validates :street_address, presence: true
end
通常情况下,我不希望没有地址的帐户被保存,但我还要转换旧系统中的大量数据,而那里的许多帐户没有地址。
我的目标是我可以将旧帐户添加到新数据库中,但是将来在编辑这些帐户时,必须添加街道地址。
澄清
正如我所说,我想跳过特定的验证;其他人应该仍然运行。例如,根本不应该将没有帐号的帐户加载到新系统中。
导入数据时如何跳过特定的模型验证?
例如,假设我有这个模型:
class Account
validates :street_address, presence: true
end
通常情况下,我不希望没有地址的帐户被保存,但我还要转换旧系统中的大量数据,而那里的许多帐户没有地址。
我的目标是我可以将旧帐户添加到新数据库中,但是将来在编辑这些帐户时,必须添加街道地址。
正如我所说,我想跳过特定的验证;其他人应该仍然运行。例如,根本不应该将没有帐号的帐户加载到新系统中。
这应该有效:
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
如果您只打算进行一次转换(即,在导入旧数据后,您不需要再次执行此操作),您可以在保存导入的记录时跳过验证,而不是修改您的应用程序以支持它.
new_account.save validate: false
注意
account.update_attribute(:street_address, new_address)
也将跳过验证。#update_attributes(注意“s”)运行验证,而 update_attribute(单数)不运行。