我有这种方法。我正在遍历每个客户端,然后检查该客户端是否符合条款。我觉得这确实效率很低。我相信一个方法应该返回上次执行操作的值,但是我仍然必须这样做:
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
但是我感觉是我误解了一个关键概念,或者我真的没有理解它。我可以提高效率吗?
答案 0 :(得分:5)
您可以直接遍历所有客户,并使用Array#select
来选择自己感兴趣的客户,而不是自己构建一个数组。def self.terms_qualifying
Client.select(&:is_terms_eligible?)
end
尽管如果您的is_terms_eligible?
方法可以移至SQL查询,则可以使所有操作更快。
如果您仍想以一种更简洁的方式编写循环,则相当于上述select:
Client.all.each_with_object([]) do |client, array|
array << client if client.is_terms_eligible?
end
as Enumerable#each_with_object返回您在块内创建的对象。
答案 1 :(得分:1)
is_terms_eligible属性是否以布尔值形式存在于数据库中? 在这种情况下,可以执行以下操作:
Client.where(is_terms_eligible: true)
那会更有表现。