2

Railsでこれを行う方法はありますか:アクティブレコードクエリがあります

@posts = Post.find_by_id(10)

クエリが呼び出されるたびに、次のような SQL が生成され、DB で実行されます

SELECT * FROM 'posts' WHERE id = 10

これは、AR クエリが実行されるたびに発生します。同様に、このようなヘルパーメソッドで

<%= f.textarea :name => 'foo' %> 
#=> <input type='textarea' name='foo' />

他のシステム (データベース、Web ブラウザー) で使用されるテキストを生成する Railsy コードをいくつか作成します。ファイル内のテキストを生成する AR クエリまたはヘルパー メソッド呼び出しを記述する方法があるかどうか疑問に思っています。この方法では、テキストのレンダリングは、メソッドが呼び出されるたびにではなく、(コードが変更されるたびに) 1 回だけ行われますか?

4

3 に答える 3

1

行を見てください。最初の行はデータベースに移動する可能性がありますが、その後は行の先頭に CACHE と表示され、ActiveRecord のクエリ キャッシュに移動することを意味します。

また、クエリではなくページをキャッシュしたいように思えます。そして、それがクエリだったとしても、それはそれほど単純ではないと思いますfind_by_id(10):)

于 2009-11-11T20:43:27.060 に答える
0

あなたの質問を完全に理解しているかどうかわかりません。

生成されたクエリについて質問しているfind_by_sql場合、アクティブ レコードの動的メソッドを使用したくない場合は、独自の SQL を作成して記述できます。

結果セットをファイルにキャッシュすることについて質問している場合、それは既にデータベースにあります。ファイルにある場合、はるかに効率的かどうかはわかりません。

于 2009-11-11T20:09:20.640 に答える
0

Radar が示唆したように、おそらく Rails キャッシングを調べる必要があります。メモリ ストアやファイル キャッシュなどの単純なものから始めて、必要に応じて memcached などのより優れたものに移行できます。一度クエリを実行した後に結果をキャッシュするヘルパー メソッドにキャッシュを入れることができます。たとえば、次のことができます。

    id = 10 # id is probably coming in as a param/argument
    cache_key = "Post/#{id}"
    @post = Rails.cache.read(cache_key)
    if @post.nil?
      @post = Post.find_by_id(id)
      # Write back to the cache for the next time
      Rails.cache.write(cache_key,@post)
    end

あとは、投稿が変更された場合にキャッシュ エントリを期限切れにするコードを追加するだけです。そのためには、Rails での「スイーパー」の使用を見てください。または、Cache-fu や Cached-model などのキャッシング gem を確認することもできます。

于 2009-11-15T23:58:25.660 に答える