我有一个模型实例变量,在其中保存着整个应用程序中“大部分”是静态的描述。
代码看起来像这样
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回调,并重新加载该实例变量。
如何才能“刷新”实例变量?
答案 0 :(得分:2)
如何才能“刷新”实例变量?
只需将其设置为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