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