我有这个方法。我循环浏览每个客户,然后检查该客户是否符合条件。我觉得这真的很低效。我认为一个方法应该返回上次执行的操作的值,但我仍然必须这样做:
def self.terms_qualifying
qualifying_client = []
Client.all.each do |client|
qualifying_client << client if client.is_terms_eligible?
end
qualifying_client
end
我知道我可以通过这样做来清理一下:
def self.terms_qualifying
qualifying_client = []
return Client.all.each do |client|
qualifying_client << client if client.is_terms_eligible?
end
end
但我觉得要么我误解了一个关键概念,要么我真的不明白。我能提高效率吗?
您可以简单地循环遍历所有客户端,并使用array#select 选择您感兴趣的客户端,而不是自己构建阵列
def self.terms_qualifying
Client.select(&:is_terms_eligible?)
end
不过,如果您的is_terms_eligible?
方法可以移动到SQL查询,它可以使一切变得更快。
如果你仍然想以更干净的方式编写循环,这将相当于上面的选择:
Client.all.each_with_object([]) do |client, array|
array << client if client.is_terms_eligible?
end
因为可枚举#each_with_object返回您在块中创建的对象。
Is_terms_qualified是作为布尔值持久化在数据库中的属性吗?在这种情况下,可以做这样的事情:
Client.where(is_terms_eligible: true)
那会更有表演性。