在使用rails之前,我从未实现过记忆化,我认为我遇到了一个很好的使用案例,但我不知道如何去做。
方法:
def manager_rep_code_and_name
manager = []
rep_code_list.each do |rep_code|
context = Finfolio::GetManagerByRepCode.call(rep_code: rep_code)
manager.push({name: context.manager.response.first["Name"], rep_code: rep_code})
end
manager
end
这个方法进行了一个网络调用,可能需要一段时间来解决这个问题。有没有办法我可以memoize
这个方法,所以如果它已经存在,我不必出去,使这个请求再次。
类似这样:
def manager_rep_code_and_name
@managers ||= manager = []
rep_code_list.each do |rep_code|
context = Finfolio::GetManagerByRepCode.call(rep_code: rep_code)
manager.push({name: context.manager.response.first["Name"], rep_code: rep_code})
end
manager
end
显然,那不起作用,但我现在有点卡住了。
5条答案
按热度按时间oaxa6hgo1#
我经常把这样的方法分开:
通常,这也使得它们更容易测试。
tf7tbtn22#
您可以使用
begin
end
块来存储多行代码的结果:qyuhtwio3#
如果你想为同一个函数存储不同的输入/输出对,那么记忆就稍微复杂一些。因为这里没有输入,而且每次的输出都是相同的,所以记忆就非常简单了,就像这样:
在本例中,将记忆化的示例变量命名为方法名的下划线版本-
@_manager_rep_code_and_name
是一种常见的约定。hrysbysz4#
变量名从
@manager
命名为@managers
,因为它包含一个数据列表。ws51t4hk5#
您可以使用
then
,它将返回给定块的值。