0

我建立我的Rails模型模式以匹配iphone contact s,這包括多值電子郵件協會等我有出口的整個觸頭陣列(可能1,000+對象,每個潛在的控制器動作包含多個電子郵件對象)。我需要這個運行相當有效,所以我在activerecord-import批量導入。但是,我需要在每個聯繫人的範圍內驗證電子郵件的唯一性,以便每次導入批次時都不會添加重複項。我應該建立自己的update_attributes版本用手,或者是有,你可能會推薦用於驗證/更新大量的這樣的記錄現有的解決方案嗎?使用Rails同步處理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 

電子郵件型號

 
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的導入不支持this)不導入重複,而是寧可更新現有記錄。用MySQL,你也可以使用INSERT IGNORE(ActiveRecord的進口支持這)進口導致指數侵犯(這是另一種方式,以避免重複)記錄時會忽略任何錯誤。

如果您正在使用PostgreSQL或SQLite等其他RDMS,那麼您需要查看他們的文檔以瞭解如何忽略違反關鍵約束(如INSERT IGNORE)。我不相信支持任何類似於ON DUPLICATE KEY UPDATE的東西。

如果你不知道這兩個CONTACT_ID和要導入那麼時間的電子郵件地址,你就必須做在你的代碼一點點的前期工作,對你是否會被複制或足夠的信息創建。

希望這會有所幫助。

+0

非常有幫助,謝謝。現在,我在服務器上推出了自己的方法。我最終會嘗試在客戶端進行驗證,並嘗試當時的activerecord-import。 – 2012-01-03 02:14:41