Jas*_*ltz 0 activerecord ruby-on-rails rails-activerecord ruby-on-rails-5
我有这个方法.我循环遍历每个客户端,然后检查该客户端是否符合条款.我觉得这真的很低效.我相信一个方法应该返回执行的最后一个操作的值,但我仍然必须这样做:
def self.terms_qualifying
qualifying_client = []
Client.all.each do |client|
qualifying_client << client if client.is_terms_eligible?
end
qualifying_client
end
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过这样做来清理一下这个:
def self.terms_qualifying
qualifying_client = []
return Client.all.each do |client|
qualifying_client << client if client.is_terms_eligible?
end
end
Run Code Online (Sandbox Code Playgroud)
但我觉得要么我误解了一个关键概念,要么我真的没有得到它.我可以提高效率吗?
您可以简单地遍历所有客户端,并使用Array#select选择您感兴趣的客户端,而不是自己构建阵列
def self.terms_qualifying
Client.select(&:is_terms_eligible?)
end
Run Code Online (Sandbox Code Playgroud)
虽然如果您的is_terms_eligible?方法可以移动到SQL查询,它可以使一切更快.
如果您仍然希望以更干净的方式编写循环,这将等同于以上选择:
Client.all.each_with_object([]) do |client, array|
array << client if client.is_terms_eligible?
end
Run Code Online (Sandbox Code Playgroud)
as Enumerable#each_with_object返回您在块内创建的对象.
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |