3

我正在使用 Ruby on Rails v3.2.2,我想通过仅在某种情况下禁用系统缓存来检索数据库数据。也就是说,在我的视图文件中,我有以下内容:

<h1>Random articles 1</h1>
<%= Article.order('RAND()').limit(3).inspect %>
...
<h1>Random articles 2</h1>
<%= Article.order('RAND()').limit(3).inspect %>

呈现视图文件时,它会在“随机文章 1”和“随机文章 2”下输出相同的数据。发生这种情况是因为 Ruby on Rails 缓存系统(“默认”/“约定”)出于性能原因尝试尽可能少地访问数据库。

如何防止这种行为(仅针对上述情况)以便在我的视图文件中为查找器方法输出不同的数据?

4

2 回答 2

6

ActiveRecord 中有uncached方法。看起来你可以这样使用它:

articles = Article.uncached do
  Article.order('RAND()').limit(3)
end

但是您最好将其提取到模型的类方法中。

有关更多信息,请参阅本文

于 2012-04-14T13:17:16.117 回答
0

我试图重现你的问题,但不能(Rails 3.2.2,使用 sqlite3 适配器,代码如下)。但无论如何都要试试这个:

Article.uncached do Article.order('RAND()').limit(3).inspect end

以下是我如何尝试在一个空的 Rails 项目中重现您的问题,但对我来说,它始终以不同的顺序生成文章:

ActiveRecord::Migration.create_table :articles do |t| t.string :name end
class Article < ActiveRecord::Base; end
20.times do |i| Article.create :name => "Article#{i}" end
# sqlite doesn't have a RAND() function, emulate it
Article.connection.instance_variable_get(:@connection).define_function 'RAND' do rand end
p *Article.order('RAND()').limit(3)

也许您在我尝试重现您的问题时发现了一个错误。

于 2012-04-14T13:17:52.733 回答