我需要限制和订购批量记录并使用find_each。我见过很多人要求这个并没有真正好的解决方案。如果我错过了,请发布一个链接!
我有30M的记录,想要在权重列中处理最高值的10M。
我尝试使用这种方法,有人写道:find_each_with_order但无法让它发挥作用。
该网站的代码不作为选项接受订单。鉴于名称是find_each_with_order,似乎很奇怪。我把它添加如下:
class ActiveRecord::Base
# normal find_each does not use given order but uses id asc
def self.find_each_with_order(options={})
raise "offset is not yet supported" if options[:offset]
page = 1
limit = options[:limit] || 1000
order = options[:order] || 'id asc'
loop do
offset = (page-1) * limit
batch = find(:all, options.merge(:limit=>limit, :offset=>offset, :order=>order))
page += 1
batch.each{|x| yield x }
break if batch.size < limit
end
end
我试图按如下方式使用它:
class GetStuff
def self.grab_em
file = File.open("1000 things.txt", "w")
rels = Thing.find_each_with_order({:limit=>100, :order=>"weight desc"})
binding.pry
things.each do |t|
binding.pry
file.write("#{t.name} #{t.id} #{t.weight}\n" )
if t.id % 20 == 0
puts t.id.to_s
end
end
file.close
end
end
BTW我有postgres中的数据,我将抓住一个子集并将其移至neo4j,所以我用neo4j标记,以防你们任何人知道如何做到这一点。感谢。
答案 0 :(得分:0)
不确定这是否是您正在寻找的,但您可以这样做:
weight = Thing.order(:weight).select(:weight).last(10_000_000).first.weight
Thing.where("weight > ?", weight).find_each do |t|
...your code...
end