我在下面有一个List模型,它与收件人有一个has_and_belongs_to_many关联。方法make_recipient_lists
的目的是以numbers
格式保存已解析的[[num1],[num2],[num3]...]
(初始参数)csv。
add_recipients
通过查找现有收件人然后将其添加到列表或创建新收件人来工作。
这整个过程适用于28分钟内少量,20k的数字。但是,数字越大,指数花费的时间越长,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
答案 0 :(得分:0)
你可以这样做。我没有测试过这个,但你明白了。
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
答案 1 :(得分:0)
我认为,你应该使用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
希望它会有所帮助。感谢。