1

別のモデルデータベースから取得したデータのシリアル化されたリストを生成するモデルメソッドを呼び出すコントローラーアクションがあります。uncachedSQLクエリはランダムなデータプルである必要があるため、これが必要です。

これが私のコードの一般的な考え方です(、はデータの任意のモデルであり、タイプはであり、データベースはSQLiteであることに注意してください)User has_one FooBar:data_listtext

# 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_dataRailsコマンドラインから実行すると、ランダム化で完全に機能することに注意してください。キャッシングが発生し始めるのは、コントローラーから呼び出されたときだけです。

私の調査uncachedでは、コントローラーでキャッシュを削除するために使用することが提案されましたが、データのシリアル化が破壊されているようで、エラーが発生します。

undefined method 'each' for #<String:0x007ff49008dc70>

実際、これは、過去にさかのぼって追加し(事前になしuncachedで正常に生成された)、コントローラーを保存した場合でも実行されますが、を呼び出さないでください。data_planuncachedgenerate_action

4

1 に答える 1

0

編集
この問題は、実際にはハッシュにオブジェクトを格納していたという事実に関連していると思います。オブジェクトに切り替えると、idこの問題が修正されました。これに関する別の SO の質問はここにあります: Rails - Accessing serialized data from console

以下は、構文がまだ人々を助けるかもしれないという理由だけで保存されていますが、それが問題の実際の原因であるとは思いません.


uncachedモデルに移動することでこれを解決しました。参考までに、私が最初にこの問題を解決するために使用していたソースは、次のリンクでした: http://railspikes.com/2008/8/18/disabling-activerecord-query-caching-when-needed

私が見落としていたのは、彼がuncachedコントローラーではなくモデルを入れているということです。また、構文を少し変更する必要がありました。

# app/models/foo.rb

self.class.uncached do
   ...
end

それ以外の

uncached do
  ...
end

構文修正のソースは、この SO レスポンスです: https://stackoverflow.com/a/967690/337903

于 2012-05-22T17:43:38.500 に答える