我有一個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