2009-06-08 6 views
1

これに作業日を費やしました。コントローラからActiveRecordアソシエーションをリロードできません

私は

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

は、私もすぐに自分の仕事をするために、複数のINSERTを使用するカスタムinsert_new_usersassociate_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)」と表示されます。

奇妙なこと - 以前はうまくいっていたし、何らかの理由で動作が停止した瞬間を特定できません。私はおそらく誰かがこれが可能であることを知っていることを望んでいた。

答えて

3

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

いずれこれはブロック内の任意のクエリの結果をキャッシュからのActiveRecordを停止するuncached

self.class.uncached do 
    # ... 
end 

の呼び出しでusersアソシエーションにプリINSERT参照を包みます。多くの場所にコードがある場合、これは迷惑かもしれません。

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

+0

モデルの中から呼び出すとき、残念なことに、未定義のメソッド「uncached」と言います。 – snitko

+1

良いキャッチ。これはクラスメソッドであり、インスタンスではありません。私は答えの範囲を修正しました。 –

+0

これはRailsのバグですか?リロードを呼び出すと、実際にリロードされるはずです。 SQLクエリキャッシュは、データベースが実際には変更されていないことを知るほどスマートですが、この場合、これは本当に心配するものではありません。 –

0

これまでのところ、私は次のようにARをだますことができました:

def associate_with 
    # mysql INSERT here 
    @users = self.users.find(:all, :conditions => ['users.id IS NOT NULL']) 
end 

def users 
    @users || self.users 
end 
0

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

User.reload

を呼び出すことができ、それがどんな関係や団体のなどの明確なキャッシュを強制する必要があります。

関連する問題