1

これに1日を費やしました。

私は持っている

class Box
  has_many :users, :through => :subscriptions
end

また、複数の INSERT を使用してジョブをすばやく実行するカスタムメソッドinsert_new_usersとメソッドもあります。associate_with(new_users)とにかく、彼らはうまくいきます。「associate_with」メソッドの最後に次の行もあります。

def associate_with
  # mysql INSERT here
  self.users(true) # Should force reload
end

テスト環境 (コントローラーとモデル テストの両方) で実行すると期待どおりに動作し、true引数を削除すると期待どおりに失敗し、リロードが強制されます。モデルscript/consoleなら開発中からでも動作します。しかし、コントローラーからupdate_attributesしようとすると、開発または生産に失敗します。update_attributes関連付けをリロードしないだけで、このクエリの「CACHE (0.0ms)」と表示されているログで確認できます。

奇妙なことに、以前は機能していましたが、何らかの理由で機能しなくなった瞬間を特定できません。誰かがこれがどのように可能であるかを知っているのではないかと思っていました。

4

3 に答える 3

3

ActiveRecord SQL クエリ キャッシュの効果が見られます。

usersへの呼び出しで関連付けへの事前 INSERT 参照をラップするか、uncached

self.class.uncached do
  # ...
end

これにより、ActiveRecord はブロック内のクエリの結果をキャッシュできなくなります。多くの場所にコードがある場合、これは面倒かもしれません。

を呼び出して、挿入が完了した後にキャッシュをクリアすることもできますconnection.clear_query_cache

于 2009-06-09T00:44:02.853 に答える
0

キャッシュを完全にクリアできる唯一の方法は、reload. たとえば、次のように呼び出すことができます。

User.reload

また、リレーションまたはアソシエーションを含め、キャッシュを強制的にクリアする必要があります。

于 2014-04-14T22:21:28.070 に答える