mysql – 防止Rails缓存ActiveRecord查询的结果

我有一个rake任务,需要遍历大量的记录(称为商家),每个记录都有大量的关联项.我的问题是,由于Rails自动缓存我的数据库查询的结果,我最终将我的工作人员放入交换空间很长时间.

简而言之,我想知道如何运行如下命令:

Merchant.all.each {| m | items = m.items}

没有缓存每次“物品”的价值.

我试过了:

Merchant.all.each do |m|`
  ActiveRecord::Base.connection.uncached do
   items = m.items
 end
end

我也尝试将其添加到我的Merchant模型中:

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

尝试进行一些错误检查,然后记录结果.

解决方法:

如果您的关联是一个简单的has_many关联,您可以尝试这样做:

Merchant.all.each do |m| 
  items = Item.find_all_by_merchant_id(m.id) 
  ...
end 

甚至:

Merchant.find(:all, :select => "id, name").each do |m| 
  items = Item.find_all_by_merchant_id(m.id) 
  ... 
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...