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
会立即触发保存。我宁愿设置所有属性并保存一次。