find_eachで順番を指定したい
pdfの作成される順番を変えたいと思いコードをいじっておりました。
以下はpdfの作成される部分のコードの一部です。
class BatchPrintJob < ApplicationJob
略
def perform(batch_print)
略
invoices.find_each do |invoice|
略
pdf << CombinePDF.load(pdf_object.path)
end
略
end
end
invoicesのレコードを引っ張る際にorderで順番を指定すればうまくいくかと思ったのですが、
find_eachは順番を指定することができないらしく、pdfの作成される順番を指定するにはどうすればいいんだろう、、、と困っておりました。
色々ググっていると以下の記事を発見しました!!
この記事を参考にしてみたら動いてくれました!!
以下のコードは変更後のものです。
class BatchPrintJob < ApplicationJob
略
def perform(batch_print)
略
invoices.order("clients.yayoi_code").find_each_with_order do |invoice|
略
pdf << CombinePDF.load(pdf_object.path)
end
略
end
end
class Invoice < ApplicationRecord
略
def self.find_each_with_order(options={})
page = 1
limit = options[:limit] || 1000
while
offset = (page-1) * limit
batch = limit(limit).offset(offset)
page += 1
batch.each{|x| yield x }
break if batch.size < limit
end
end
略
end
find_each_with_order メソッドの中身が難しくてよくわからなかったのでbinding.pryを挟みながら、変数の値を確認してみました。
limitはいっぺんにブロックの処理を実行するオブジェクトの数、
batchはいっぺんに処理を行うオブジェクトの塊、
offsetは、、、何だろう、、、batchの何番目の塊を引っ張るか判断するためのオブジェクトでしょうか。。。
batch.each{|x| yield x} の部分は do ~ endまでのブロックを実行しているようです。
ネットの情報を参考にするとしても、
理解した上で、きちんと理由を持って、コードを書いていきたいです。。。!!