首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails模型优化

Rails模型优化
EN

Stack Overflow用户
提问于 2013-07-27 06:13:38
回答 2查看 82关注 0票数 1

下面有一个列表模型,它与收件人有has_and_belongs_to_many关联。make_recipient_lists方法的目的是以这种格式[[num1],[num2],[num3]...]保存解析的numbers(初始参数)的csv。

add_recipients的工作方式是查找现有收件人,然后将他们添加到列表中或创建新收件人。

这整个过程很好的小量,20k的数字在28分钟内。然而,这个数字越大,花费的时间就越长,70k就花了14个小时。可能是因为它正在检查缓存的current_lists的副本。

问题是,有什么办法让这件事更快吗?我可能把这个问题搞错了。谢谢!

代码语言:javascript
复制
class List < ActiveRecord::Base

#other methods above

  def make_recipient_lists(numbers,options)
    rejected_numbers = []
    account = self.user.account

    #caching recipients
    current_recipients = self.recipients

    numbers.each do |num|
      add_recipient(num[0], current_recipients)
    end

  end

  def add_recipient(num, current_recipients)
    account = self.user.account

    recipient = current_recipients.where(number:num, account_id: account.id).first
    recipient ||= current_recipients.create!(number:num, account_id: account.id)

    recipient
  end

end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-27 07:11:54

你可以这样做。我还没有测试过这个,但你知道了。

代码语言:javascript
复制
  def make_recipient_lists(numbers, options)
    rejected_numbers = []
    account = self.user.account
    existing_numbers = self.recipients.where(number: numbers, account_id: account.id).map(&:number)
    new_records = (numbers - existing_numbers).map {|n| {number: n, account_id: account.id, list_id: self.id} }

    Recipient.create new_records
  end
票数 0
EN

Stack Overflow用户

发布于 2013-07-27 07:18:06

我认为,您应该使用rails active_record查询接口。为此,您可以使用方法find_or_create方法:它将使查询速度更快。这样更改您的方法,并检查时间差:

代码语言:javascript
复制
def make_recipient_lists(numbers,options)
    rejected_numbers = []
    account = self.user.account

    #caching recipients
    current_recipients = self.recipients

    numbers.each do |num|
      self.recipients.find_or_create_by(number: num, account_id: account.id)      
    end
end

希望能帮上忙。谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17894864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档