微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐