该special_item_id_list
方法负责返回一个 id 数组。查询和逻辑非常复杂,我只想在每个页面请求中运行一次,但我将在许多不同的地方使用生成的 id 数组。这个想法是能够自由地使用is_special?
方法或special_items
范围,而不必担心每次使用时都会产生开销,因此他们依赖special_item_id_list
方法来完成繁重的工作和缓存。
我不希望此查询的结果在页面加载之间持续存在,但我希望查询在每个页面加载时只运行一次。我不想使用全局变量,并认为模型上的类变量可能有效,但似乎类变量在页面加载之间确实存在。我猜这个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 可能是一种更清洁的方式。