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