別のモデルデータベースから取得したデータのシリアル化されたリストを生成するモデルメソッドを呼び出すコントローラーアクションがあります。uncached
SQLクエリはランダムなデータプルである必要があるため、これが必要です。
これが私のコードの一般的な考え方です(、はデータの任意のモデルであり、タイプはであり、データベースはSQLiteであることに注意してください)User
has_one
Foo
:Bar
:data_list
text
# app/models/foo.rb
class Foo < ActiveRecord::Base
serialize :data_list
def generate_data
list = []
for i in 1..4
data = Bar.find(:first, :order => "Random()")
list << data
end
self.data_list = list
end
end
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def generate_action
...
uncached do
@user.foo.generate_data
end
@user.foo.save
end
end
# app/views/user/show.html.erb
...
<% @user.foo.data_list.each do |data| %>
<%= data %><br />
<% end %>
uncached do ... end
削除されるたびに、すべてが正常に機能し、ビューはのオブジェクト show
の各セットを印刷します。残念ながら、RailsのSQLキャッシングのため、最終的には次のようになります。Bar
@user.foo.data_list
RandomDataPoint8
RandomDataPoint8
RandomDataPoint8
RandomDataPoint8
私がこのように見える必要があるとき:
RandomDataPoint7
RandomDataPoint13
RandomDataPoint2
RandomDataPoint21
user.foo.generate_data
Railsコマンドラインから実行すると、ランダム化で完全に機能することに注意してください。キャッシングが発生し始めるのは、コントローラーから呼び出されたときだけです。
私の調査uncached
では、コントローラーでキャッシュを削除するために使用することが提案されましたが、データのシリアル化が破壊されているようで、エラーが発生します。
undefined method 'each' for #<String:0x007ff49008dc70>
実際、これは、過去にさかのぼって追加し(事前になしuncached
で正常に生成された)、コントローラーを保存した場合でも実行されますが、を呼び出さないでください。data_plan
uncached
generate_action