刷新使用 || 设置的类实例变量=.



我有一个模型实例变量,其中我保留了在整个应用程序中"大部分"静态的描述。

代码如下所示

def self.get_lastname(client_id)
  @client_by_lastname ||= Client.select(:id, :lastname)
  .map{|e| e.attributes.values}
  .inject({}){|memo, client| memo[client[0]] = client[1]; memo}
  return @client_by_lastname[client_id] if @client_by_lastname[client_id]
  result = Client.select('lastname').where('id = ?',client_id)
  return @client_by_lastname[client_id] = result[0].lastname 
end

所以本质上。首次加载时,它将客户端及其姓氏存储在数组中。但是,当客户被另一个实体购买时,客户"可能"每隔一段时间就会更改姓氏。客户端 ID 保持不变,但名字和姓氏将更改。发生这种情况时,此客户端姓氏最终在应用程序中出错,我们基本上必须重新启动应用程序才能重置实例变量。

必须有一种方法可以重置这些实例变量,以便在下次查询它们时重新加载它们。然后,当修改名字或姓氏时,我会在客户端文件上放置一个after_save回调,并重新加载该实例变量。

如何"刷新"实例变量?

如何"刷新"实例变量?

只需将其设置为 nil .然后,在下次调用时,它将从数据库重新加载。

或者你可以主动自己替换值。首先,记忆和计算分开。

def self.get_lastname(client_id)
  @client_by_lastname ||= compute_client_by_last_name
end
def compute_client_by_last_name
  Client.select(:id, :lastname)
      .map{|e| e.attributes.values}
      .inject({}){|memo, client| memo[client[0]] = client[1]; memo}
end

然后,当您想要刷新状态时(在after_save回调中或任何地方(

@client_by_lastname = compute_client_by_last_name

最新更新