2015-08-28 62 views
0

我使用的叫做omnicontacts的gem允许我导出我的gmail联系人。当我找回我的联系人时,我想将它们保存到名为“联系人”的表格中。单独保存一个对象数组

但是,我收到了一系列电子邮件,然后我必须在循环中查看每个电子邮件并打印出他们的电子邮件。现在我想知道如何保存它们(每封电子邮件都是它自己的)。从技术上讲,我想我可以通过创建函数循环,但这会占用大量的时间。

当接收数组时,最好的做法是什么,然后遍历每个数组以保存它们?

目前我做这在我的观点:

<h1>Your Contacts</h1> 
<div class="list-group"> 
    <% @contacts.each do |contact| %> 
    <div class="list-group-item"> 
     <div class="media"> 
     <div class="media-left"> 
      <%= image_tag avatar_url(contact[:email].to_s), height: '50', width: '50', alt: "#{contact[:name]}", class: 'img-rounded img-object' %> 
     </div> 
     <div class="media-body"> 
      <h4 class="list-group-item-heading media-heading"><%= contact[:name].titleize %></h4> 
      <p class="list-group-item-text text-muted"><%= contact[:email] %> </p> 
     </div> 
     </div> 
    </div> 
    <% end %> 
</div> 

我的控制器看起来是这样的:

def create 
    @imported_contacts = request.env['omnicontacts.contacts'] 
    @user = request.env['omnicontacts.user']  
end 
+0

你有多少联系人?你认为什么是“疯狂”的时间?如果您的联系人数量少于或等于几千人,则循环并保存每个联系人所需的时间应该相当易于管理。 –

+0

我的意思是,我想这只是我的好奇心,让我想看看它是否能够以1为例,而不是1000分贝。 –

+0

此外,正如你已经有@ @ contacts'数组一样,你不必创建新的联系人,你只需要在数据库中更新他们的'email'属性,如下面的答案所示。 –

回答

0

你实际上是通过@contacts必须循环和创建联系人与email属性是这样的:

@contacts.each {|contact| Contact.create(email: contact[:email].to_s)} 

因为,每个联系人都有他们独特的电子邮件,所以你不能一次创建所有的,你必须通过它们。

如果某些属性在所有联系人中是通用的,那么您可以使用update_all一次更新所有联系人的属性。但是,在这种情况下,每个联系人的联系人电子邮件都不相同,因此如果没有像上面显示的那样循环访问,则无法更新它们。

+0

我不能在我的数据库中使用update_attribute。我只是从Google获取并显示它们。 –

+0

好吧,我以为你已经在你的'@ contacts'数组中拥有你的联系人了。如果不是,那么你需要创建一个create call而不是update:'Contact.create(:email,contact [:email] .to_s)''。无论如何,您必须循环浏览它们,因为电子邮件对于每个联系人都是唯一的。我已经更新了我的答案。 –

1

如果您通过联系人循环并单独创建它们,则会有很多数据库事务并且性能受到影响。我建议你使用activerecord-import https://github.com/zdennis/activerecord-import。在一个创建查询中,您应该能够将所有记录插入数据库。

+0

这是wiki中的一个例子https://github.com/zdennis/activerecord-import/wiki – Rajuk

相关问题