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

Ruby on rails 导入数据时如何跳过特定验证?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,导入数据时,如何跳过特定的模型验证 例如,假设我有这个模型: class Account validates :street_address, presence: true end 通常情况下,我不希望帐户保存时没有地址,但我还将转换旧系统中的大量数据,其中许多帐户没有地址 我的目标是,我可以将旧帐户添加到新数据库中,但将来编辑这些帐户时,必须添加街道地址 澄清 正如我所说,我想跳过一个特定的验证;其他人应该继续竞选。例如,没有帐号的帐户根本不应该加载到新系统中。这应该可以: class

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

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

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
这应该起作用:

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

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

new_account.save validate: false
注意

account.update_attribute(:street_address, new_address)
也将跳过验证#update_属性(注意“s”)运行验证,而update_属性(单数)不运行验证

注意

account.update_attribute(:street_address, new_address)

也将跳过验证#update_属性(注意“s”)运行验证,而update_属性(单数)不运行验证

在数据库中使用布尔值是一种很好的方法。您可能会考虑编辑标题,因为这实际上是关于数据状态前后的,而不是关于条件验证的。@ TomHarrisonJr -实际上,在我的例子中,布尔不会被持久化;它只是一个
属性访问器
。这样它就进入数据库,但一旦进入数据库,就没有特殊处理,需要更新它的任何人提供街道地址。在数据库中使用布尔值是一种很好的方法。您可能会考虑编辑标题,因为这实际上是关于数据状态前后的,而不是关于条件验证的。@ TomHarrisonJr -实际上,在我的例子中,布尔不会被持久化;它只是一个
属性访问器
。这样它就会进入数据库,但一旦进入数据库,它就不会被特别处理,需要更新它的任何人提供街道地址。除了我只想跳过特定的验证,而不是所有验证。我明白了。那么我认为你的方式可能是最好的选择。除了我只想跳过特定的验证,而不是所有的验证。我明白了。那么我认为您的方式可能是最好的选择。
update\u属性
会立即触发保存。我宁愿设置所有属性并保存一次。
update\u attribute
会立即触发保存。我宁愿设置所有属性并保存一次。