2009-08-21 8 views
1

私はActiveRecordのとRails(また、これはJRubyのであるので、私は実際に重要な場合には、jdbcsqliteアダプタを使用しています)でsqliteのを使用している状況にいますよ。今、私は行をテーブルattention_seekersに挿入しようとしていますが、それ以外の既存の類似した行がない場合に限ります。あなたが見つけることが、私はそれに影響を与える要素を挿入してるにもかかわらず、キャッシュされているいくつかの理由で、見ることができるようにsqliteが特定のselectクエリをキャッシュしないようにする方法は?

CACHE (0.0ms) SELECT * FROM attention_seekers WHERE (attention_seekers.key_id = 318 AND attention_seekers.locale_id = 20) 
AttentionSeeker Create (1.0ms) INSERT INTO attention_seekers (key_id, locale_id) VALUES(318, 20) 
CACHE (0.0ms) SELECT * FROM attention_seekers WHERE (attention_seekers.key_id = 318 AND attention_seekers.locale_id = 20) 
AttentionSeeker Create (2.0ms) INSERT INTO attention_seekers (key_id, locale_id) VALUES(318, 20) 

:したがって、

unless AttentionSeeker.find(:first, :conditions => {:key_id => key.id, :locale_id => l.id}) 
    item = AttentionSeeker.new(:key_id => key.id, :locale_id => l.id) 
    item.save 
end 

これは、ログに生成され出力されます。何が間違っているのですか/どうすればこの行動を止めることができますか?

答えて

3

私はいくつかの掘削をしたし、利用可能なより多くの情報hereで、this helpful blog postに出くわしました。私の解決策は、(マイクBuckbeeが提案検証を使用して - 感謝!):スキーマ・レベルで

AttentionSeeker.uncached do 
    item = AttentionSeeker.new(:key_id => key.id, :locale_id => l.id) 
    item.save 
end 
+0

恐ろしいジョシュ、喜んであなたはそれが考え出しました。 –

1

代わりに(私はそれを推測しているところさである)あなたのコントローラにこのコードを置くことで、あなたは私が問題を解決するだろうと思うその代わりに、検証を使用して検討する必要があります。

class AttentionSeeker < ActiveRecord::Base 
    validates_uniqueness_of :key_id, :scope => :locale_id 
end 

してください検証ルールの "scope"オプションに注意してください。

あなたはそれに失敗Transaction

でクエリをラップ試みることができることを失敗すると、これはあなたがクエリ自体にキャッシュ対策を追加することができます信じられないほどjankyようです。何かのように

buster = rand(Time.now) 
attention_seeker = AttentionSeeker.find(:first, :conditions => ["#{buster} = #{buster}"]) 

これはあなたのループを介して毎回ユニークなクエリを与える必要があります。

+0

を参照してください。私はこれを試して興奮していたが、私はまったく同じ行動を見ています。 –

+0

トランザクションでラッピングしようとしましたか? (私の第二の提案) –

+0

私は、トランザクションに上記のスニペットを包んが、変化はなかったです。 –

関連する問題