0

我已经构建了我的 Rails 模型模式以匹配iphone 联系人,其中包括多值电子邮件关联等。我有一个控制器操作,可以导入整个联系人数组(可能有 1,000 多个对象,每个对象都可能包含多个电子邮件对象)。我需要它来相当有效地运行,所以我正在寻找用于批量导入的activerecord-import 。但是,我需要在每个联系人的范围内验证电子邮件的唯一性,这样我就不会在每次导入批次时都不断添加重复项。我应该手动构建自己的版本update_attributes,还是您可能会推荐现有的解决方案来验证/更新大量这样的记录?

联系方式

类联系人> 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,
                  :昵称,:组织,:job_title,:部门,:生日,
                  :addresses_attributes, :emails_attributes, :websites_attributes                  
结尾

电子邮件模型

类电子邮件> ActiveRecord::Base
  属于_to :contact
  # 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 支持此功能),它会在导入导致索引违规的记录时忽略任何错误(这是避免重复的另一种方法)。

如果您正在使用其他 RDMS,如 PostgreSQL 或 SQLite,那么您将需要查看他们的文档以了解如何忽略违反键约束(如 INSERT IGNORE)。我不相信任何一种开箱即用的支持类似于 ON DUPLICATE KEY UPDATE 的东西。

如果您在要导入时不知道contact_id 和电子邮件地址,那么您必须在代码中做一些前期工作,以获得有关您是复制还是创建的足够信息。

希望这可以帮助。

于 2012-01-02T22:42:44.180 回答