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

时间:2012-12-03 15:43:37

标签: ruby-on-rails ruby activerecord

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

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

class Account
  validates :street_address, presence: true
end

通常情况下,我不希望在没有地址的情况下保存帐户,但我也会从旧系统转换大量数据,而且许多帐户都没有地址。

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

澄清

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

3 个答案:

答案 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')运行验证,其中up​​date_attribute(singular)没有。