一種選擇是把你的特定型號量身定製的實現到模型本身(說到這,id
通常是訂購的記錄是更好的選擇,created_at
可能有重複):
class Thing < ActiveRecord::Base
def self.find_each_desc limit
batch_size = 1000
i = 1
records = self.order(created_at: :desc).limit(batch_size)
while records.any?
records.each do |task|
yield task, i
i += 1
return if i > limit
end
records = self.order(created_at: :desc).where('id < ?', records.last.id).limit(batch_size)
end
end
end
要不然你可以概括的事情了一下,使其成爲所有車型的工作:
lib/active_record_extensions.rb
:
ActiveRecord::Batches.module_eval do
def find_each_desc limit
batch_size = 1000
i = 1
records = self.order(id: :desc).limit(batch_size)
while records.any?
records.each do |task|
yield task, i
i += 1
return if i > limit
end
records = self.order(id: :desc).where('id < ?', records.last.id).limit(batch_size)
end
end
end
ActiveRecord::Querying.module_eval do
delegate :find_each_desc, :to => :all
end
config/initializers/extensions.rb
:
require "active_record_extensions"
P.S.我按照this answer將代碼放入文件中。
任何細節你有沒有接受任何答案的理由? – 2013-11-19 21:26:58
對不起,我忘了: - \ – Avishai 2013-12-12 20:59:19
在像find_each這樣的批處理操作中,find_in_batches的作用域順序和限制被忽略,它被強制爲批處理順序和批處理大小 – 2014-11-10 15:21:13