0

Rails モデル スキーマを作成して、iPhoneの contact に一致するように作成しました。これには、複数値の電子メールの関連付けなどが含まれます。連絡先配列全体 (おそらく 1,000 以上のオブジェクトで、それぞれに複数の電子メール オブジェクトが含まれている可能性があります) をインポートするコントローラー アクションがあります。これをかなり効率的に実行する必要があるため、バッチ インポート用のactiverecord-importを検討していました。ただし、バッチがインポートされるたびに重複を追加し続けないように、各連絡先の範囲内で電子メールの一意性を検証する必要があります。独自のバージョンをupdate_attributes手動で作成する必要がありますか、またはこのような多くのレコードを検証/更新するために推奨できる既存のソリューションはありますか?

連絡先モデル

class Contact > ActiveRecord::Base
  has_many :アドレス
  has_many :メール
  has_many :ウェブサイト
  accept_nested_attributes_for :addresses、:emails、:websites
  attr_accessible :prefix, :first_name, :middle_name, :last_name, :suffix,
                  :ニックネーム, :所属, :役職, :部署, :誕生日,
                  :addresses_attributes、:emails_attributes、:websites_attributes                  
終わり

メールモデル

クラス Email > ActiveRecord::Base
  所属先:連絡先
  # validates_uniqueness_of :account, :scope => :contact_id # 重複を防ぎますが、兄弟の値もスキップします
  # 検証 :contact_id, :presence => true, :on => :create # 422 エラーが発生する
  検証 :account, :presence => true, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[az]{2, })\Z/i, :on => :create
  attr_accessible :contact_id、:email_id、:account、:label
終わり
4

1 に答える 1

1

これを行うためのactiverecord-importには組み込みのサポートはありません。

ただし、インポート時にcontact_idと電子メールアドレスの両方がわかっている場合は、contact_idと電子メールアドレスに一意のインデックスを使用できます。MySQLでは、ON DUPLICATE KEY UPDATEサポート(activerecord-importはこれをサポートします)を使用して、重複をインポートせずに、既存のレコードを更新できます。MySQLでは、INSERT IGNORE(activerecord-importはこれをサポートします)を使用することもできます。これは、インデックス違反の原因となるレコードをインポートするときにエラーを無視します(これは重複を回避する別の方法です)。

PostgreSQLやSQLiteなどの別のRDMSを使用している場合は、それらのドキュメントを参照して、違反しているキー制約(INSERT IGNOREなど)を無視する方法を確認する必要があります。箱から出してすぐにONDUPLICATEKEYUPDATEに似たものをサポートすることもできないと思います。

インポートするときにcontact_idと電子メールアドレスの両方がわからない場合は、複製するか作成するかについて十分な情報を得るために、コードで少し前もって作業を行う必要があります。

お役に立てれば。

于 2012-01-02T22:42:44.180 に答える