我有一个rake任务,需要遍历大量记录(称为商家),每个记录都有大量的关联项目。我的问题是,由于Rails自动缓存我的数据库查询的结果,我最终将我的工作人员放入交换空间很长时间。防止导致ActiveRecord查询结果缓存导致
总之,我想知道如何运行像这样的命令:没有缓存,每次通过“项目”的值
Merchant.all.each { |m| items = m.items }
。
我已经试过:
Merchant.all.each do |m|`
ActiveRecord::Base.connection.uncached do
items = m.items
end
end
和我也尝试添加这对我的商家模式:
def items_uncached
self.class.uncached { items }
end
,然后调用items_uncached代替,但我最终仍费尽了内存使用情况以及我访问的每一组新项目。
我正在运行Rails 2.3.10,Ruby 1.9.2并使用Mysql进行存储。
在此先感谢您的想法!
*编辑:
这里是我工作的实际代码位:
File.open(output, "w") do |f|
Merchant.all.each do |m|
items = m.items
invalid_image_count = 0
items.each do |i|
invalid_image_count += 1 unless i.image_valid?
end
invalid_categories = items.select { |i| !i.categories_valid? }.count
f.puts "#{m.name} (#{m.id}): #{invalid_image_count} invalid images, " +
"#{invalid_categories} invalid categories"
end
end
试图做一些错误检查,然后记录结果。
你想要做的事情在这里不是很清楚;也许你正在寻找像'ActiveRecord :: Base#find_each'? – coreyward
好的,是的,我只是看着find_each,实际上可能会有所帮助。我会试试看。 – peter
为了表达更好一点,当我在控制台中运行此代码时:Merchant.all.each {| m | items = m.items;打印“#{m.id}”},在每次迭代中,我的内存使用情况都会出现波动。我的猜测是,这是由于m.items产生1至10,000以上的ActiveRecords。 – peter