下面有一个列表模型,它与收件人有has_and_belongs_to_many关联。make_recipient_lists方法的目的是以这种格式[[num1],[num2],[num3]...]保存解析的numbers(初始参数)的csv。
add_recipients的工作方式是查找现有收件人,然后将他们添加到列表中或创建新收件人。
这整个过程很好的小量,20k的数字在28分钟内。然而,这个数字越大,花费的时间就越长,70k就花了14个小时。可能是因为它正在检查缓存的current_lists的副本。
问题是,有什么办法让这件事更快吗?我可能把这个问题搞错了。谢谢!
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发布于 2013-07-27 07:11:54
你可以这样做。我还没有测试过这个,但你知道了。
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发布于 2013-07-27 07:18:06
我认为,您应该使用rails active_record查询接口。为此,您可以使用方法find_or_create方法:它将使查询速度更快。这样更改您的方法,并检查时间差:
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希望能帮上忙。谢谢。
https://stackoverflow.com/questions/17894864
复制相似问题