ruby-on-rails - 刷新使用 ||= 设置的类实例变量
问题描述
我有一个模型实例变量,我在其中保存在整个应用程序中“大部分”静态的描述。
代码看起来像这样
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
推荐阅读
- html - 右对齐元素向下移动
- java - 以编程方式检测 JRE 中的 --preview 模式
- wordpress - 更改标签云中的字体大小
- xcodebuild - 在 iOS 13 模拟器上并行运行超过 2 个模拟器时,XCTests 随机崩溃
- html - 我正在做汉堡菜单,但我的第三条条纹不会出现
- angular - 使用共享模块的未知角度元素错误
- docker - 从 docker 容器到 kubernetes pod 的端口发布如何工作?
- capl - CAPL 获取创建的日志文件的名称
- reactjs - React 富文本编辑器 - 在 ENTER 上清除状态
- swift - Swift 5:什么是“转义闭包捕获变异的“自我”参数”以及如何修复它