Синхронизация контактов iphone с Rails - PullRequest
0 голосов
/ 30 декабря 2011

Я построил схему модели Rails для соответствия iphone contact s, который включает в себя многозначные ассоциации электронной почты и т. Д. У меня есть действие контроллера, которое импортирует весь массив контактов (вероятно, более 1000 объектов,каждый из которых может содержать несколько объектов электронной почты).Мне нужно, чтобы это работало достаточно эффективно, поэтому я искал 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 Ответ

1 голос
/ 03 января 2012

В activerecord-import нет встроенной поддержки для этого.

Однако, если вы знаете как contact_id, так и адрес электронной почты на момент импорта, вы можете использовать уникальный индекс для contact_id и адреса электронной почты. В MySQL вы можете использовать поддержку ON DUPLICATE KEY UPDATE (activerecord-import поддерживает this ), чтобы не импортировать дубликат, а скорее обновить существующую запись. С MySQL вы также можете использовать INSERT IGNORE (activerecord-import поддерживает это), который будет игнорировать любые ошибки при импорте записей, которые вызывают нарушения индекса (это еще один способ избежать дублирования).

Если вы используете другую СУБД, такую ​​как PostgreSQL или SQLite, вам нужно просмотреть их документы, чтобы увидеть, как можно игнорировать нарушение ключевых ограничений (например, INSERT IGNORE). Я не верю ни в поддержку ничего похожего на ON DUPLICATE KEY UPDATE из коробки.

Если вы не знаете как contact_id, так и адрес электронной почты в то время, когда вы хотите импортировать, вам придется проделать небольшую предварительную работу с вашим кодом, чтобы иметь достаточно информации о том, будете ли вы дублировать или создавать .

Надеюсь, это поможет.

...