Railsでmemcachedとnamed_scopeを組み合わせて使ってハマった。
以下のようなコードを書いていて、クエリの結果をキャッシュしているはずなのに、SQLが発行されるなぁ、、何でだろうなぁ、、と思っていた。
def recent_entries
get_cache("recent_entries") do
Entry.newly.user(self.id).limit(10)
end
end
で、結論としては、named_scopeは値が初めて評価される時にSQLが実行されるので、上記状態だとまだ、SQLが未発行の状態でキャッシュされる。
telnet localhost 11211
で実際にキャッシュの内容を確認すると以下のようになっている。
get app:User:1:recent_entries
VALUE app:User:1:recent_entries 1 224
o:$ActiveRecord::NamedScope::Scope:@proxy_scopeo;;o;c
Entries:)@current_scoped_methods_when_defined0:@proxy_options{:conditions"#user_id = ? i?{:
order"created_at DESC{:
limiti
END
つまり、まだnamed_scopeのまま。
そして、キャッシュしているつもりなのに全然負荷が落ちないという結果に。。
named_scopeを強制発行する方法がわからないので、とりあえず、
def recent_entries
get_cache("recent_entries") do
Entry.newly.user(self.id).limit(10).collect{|i| i}
end
end
とした。
| 固定リンク | コメント (0) | トラックバック (0)
最近のコメント