用Rails同步iphone联系人



我已经构建了Rails模型模式来匹配iphone联系人,其中包括多值电子邮件关联等。我有一个导入整个联系人数组的控制器动作(可能有1000多个对象,每个对象可能包含多个电子邮件对象)。我需要这个运行相当有效,所以我正在寻找activerrecord -import批量导入。但是,我需要在每个联系人范围内验证电子邮件的唯一性,这样我就不会在每次导入批处理时不断添加副本。我应该手工构建自己的update_attributes版本,还是有一个现有的解决方案,您可能会推荐用于验证/更新大量这样的记录?

接触模型

<>之前类Contact> ActiveRecord::Basehas_many:地址has_many:电子邮件has_many:网站Accepts_nested_attributes_for:地址、:邮件、:网站Attr_accessible:prefix,:first_name,:middle_name,:last_name,:suffix,:昵称,:组织,:职位,:部门,:生日,:addresses_attributes,:emails_attributes,:websites_attributes结束之前<<p> 邮件模型/strong> <>之前类Email> ActiveRecord::Basebelongs_to:联系# validates_uniqueness_of:account,:scope =>:contact_id #防止重复,但也跳过兄弟值# validates:contact_id,:presence => true,:on =>:create #导致422错误验证:账户:=> true,格式=>/ ([^ @ s ]+)@((?:[- a-z0-9 ] +) + [a - Z] {2,}) Z/我:=>:创建Attr_accessible:contact_id,:email_id,:account,:label结束

activerrecord -import中没有内置支持此操作。

但是,如果您在导入时知道contact_id和email地址,则可以在contact_id和email地址上使用唯一索引。在MySQL中,您可以使用ON DUPLICATE KEY UPDATE支持(activerrecord -import确实支持此功能)来不导入副本,而是更新现有记录。在MySQL中,你也可以使用INSERT IGNORE (activerrecord -import支持此功能),它将在导入导致索引冲突的记录时忽略任何错误(这是避免重复的另一种方法)。

如果你正在使用其他RDMS,如PostgreSQL或SQLite,那么你会想看看他们的文档,看看如何忽略违反键约束(如INSERT ignore)。我不相信两者都支持任何类似于ON DUPLICATE KEY UPDATE开箱即用的东西。

如果你在导入时不知道contact_id和email地址,那么你就必须在代码中做一些前期工作,以获得足够的信息,知道你是在复制还是在创建。

最新更新