1

このspecial_item_id_listメソッドは、ID の配列を返す役割を果たします。クエリとロジックは非常に複雑なので、ページ リクエストごとに 1 回だけ実行する必要がありますが、結果として得られる ID の配列をさまざまな場所で利用します。メソッドやスコープを使用するたびにオーバーヘッドが発生することを心配することなく、is_special?メソッドやスコープを自由に使用できるようにするためのアイデアです。special_itemsspecial_item_id_list

このクエリの結果がページの読み込み間で持続することは望ましくありませんが、ページの読み込みごとにクエリを 1 回だけ実行したいと考えています。グローバル変数を使用したくないので、モデルのクラス変数が機能する可能性があると考えましたが、クラス変数はページの読み込み間で持続するようです。ItemクラスはRailsスタックの一部であり、メモリに残っていると思います。

では、ページが読み込まれるたびに再構築されるように、ID リストを格納するのに適した場所はどこでしょうか?

class Item < ActiveRecord::Base

  scope :special_items, lambda { where(:id => special_item_id_list) }

  def self.special_item_id_list
    @special_item_id_list ||= ... # some complicated queries
  end

  def is_special?
    self.class.special_item_id_list.include?(id)
  end

end

更新:を使用するのはThreadどうですか? 以前に現在のユーザーを追跡するためにこれを行ったことがあり、ここに適用できると思いますが、別の方法があるのだろうか? これは、スレッドについて話し合うStackOverflow の会話です。また、 request_storeについても言及しています。gem はおそらくそうするためのよりクリーンな方法です。

4

3 に答える 3

1

最初は、Jonathan Bender の提案を利用する形で行きましたRails.cache(John に感謝します)。良いアイデアがないので、やっぱり使ったほうがいいのではないかと思いましたThread。最終的に、クエリ結果を保存するためにrequest_store gem をインストールしました。これにより、必要な期間 (要求/応答の有効期間) の間データが保持され、有効期限が切れる必要がなくなります。

于 2013-10-18T21:42:48.287 に答える