使用Rails同步iphone联系人

时间:2011-12-30 04:11:38

标签: iphone activerecord ruby-on-rails-3.1 associations import-contacts

我构建了我的Rails模型架构以匹配iphone contact,其中包括多值电子邮件关联等。我有一个控制器操作可以导入整个联系人数组(可能有1,000多个对象,每个对象都可能包含多个电子邮件对象)。我需要这个才能相当有效地运行,因此我正在查看activerecord-import批量导入。但是,我需要在每个联系人的范围内验证电子邮件的唯一性,以便每次导入批处理时都不会继续添加重复项。我应该手动构建自己的update_attributes版本,还是有可能建议用于验证/更新大量此类记录的现有解决方案?

联系模式

class Contact > ActiveRecord::Base
  has_many :addresses
  has_many :emails
  has_many :websites
  accepts_nested_attributes_for :addresses, :emails, :websites
  attr_accessible :prefix, :first_name, :middle_name, :last_name, :suffix,
                  :nickname, :organization, :job_title, :department, :birthday,
                  :addresses_attributes, :emails_attributes, :websites_attributes                  
end

电子邮件模型

class Email > ActiveRecord::Base
  belongs_to :contact
  # validates_uniqueness_of :account, :scope => :contact_id # prevents duplicate, but also skips sibling values
  # validates :contact_id, :presence => true, :on => :create # causes 422 error
  validates :account, :presence => true, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
  attr_accessible :contact_id, :email_id, :account, :label
end

1 个答案:

答案 0 :(得分:1)

执行此操作时,activerecord-import中没有内置支持。

但是,如果您在导入时知道contact_id和电子邮件地址,则可以在contact_id和电子邮件地址上使用唯一索引。在MySQL中,您可以使用ON DUPLICATE KEY UPDATE支持(activerecord-import支持this)来不导入重复项,而是更新现有记录。使用MySQL,您还可以使用INSERT IGNORE(activerecord-import支持此功能),这将在导入导致索引违规的记录时忽略任何错误(这是避免重复的另一种方法)。

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

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

希望这有帮助。