0

Я построил схему модели Rails для соответствия iphone contact s, которая включает в себя многозначные ассоциации электронной почты и т. Д. У меня есть действие контроллера, которое импортирует весь массив контактов (вероятно, 1000+ объектов, каждый потенциально содержащий несколько объектов электронной почты). Мне нужно, чтобы это выполнялось достаточно эффективно, поэтому я смотрел на activerecord-import для пакетного импорта. Однако мне нужно проверить уникальность электронной почты в рамках каждого контакта, чтобы я не добавлял дубликаты каждый раз, когда пакет импортируется. Должен ли я создать свою собственную версию update_attributes вручную или существует ли существующее решение, которое вы могли бы рекомендовать для проверки/обновления множества записей, подобных этому?Синхронизация контактов iphone с рельсами

Контакт Модель

 
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 

Email Модель

 
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

Там нет встроенной поддержки в ActiveRecord-импорта для этого.

Однако, если вы знаете как 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, но и адрес электронной почты в момент, когда хотите импортировать, вам нужно будет сделать небольшую работу в своем коде, чтобы иметь достаточно информации о том, будете ли вы дублировать или Создание.

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

+0

Очень полезно, спасибо. Я покачал свой собственный метод на сервере. В конечном итоге я попытаюсь выполнить проверку на клиенте и попробовать активировать импорт-импорт в это время. –

Смежные вопросы