1

导入数据时如何跳过特定的模型验证?

例如,假设我有这个模型:

class Account
  validates :street_address, presence: true
end

通常情况下,我不希望没有地址的帐户被保存,但我还要转换旧系统中的大量数据,而那里的许多帐户没有地址。

我的目标是我可以将旧帐户添加到新数据库中,但是将来在编辑这些帐户时,必须添加街道地址。

澄清

正如我所说,我想跳过特定的验证;其他人应该仍然运行。例如,根本不应该将没有帐号的帐户加载到新系统中。

4

3 回答 3

7

这应该有效:

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
于 2012-12-03T15:43:37.213 回答
1

如果您只打算进行一次转换(即,在导入旧数据后,您不需要再次执行此操作),您可以在保存导入的记录时跳过验证,而不是修改您的应用程序以支持它.

new_account.save validate: false
于 2012-12-03T17:13:08.270 回答
0

注意

account.update_attribute(:street_address, new_address)

也将跳过验证。#update_attributes(注意“s”)运行验证,而 update_attribute(单数)不运行。

于 2012-12-03T18:04:37.197 回答