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

変換を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 に答える