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

uncachedActiveRecordにはメソッドがあります。次のように使用できるようです。

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 に答える