有没有一种更干净的方法可以从Rails ActiveRecord方法返回数组的结果



我有这个方法。我循环浏览每个客户,然后检查该客户是否符合条件。我觉得这真的很低效。我认为一个方法应该返回上次执行的操作的值,但我仍然必须这样做:

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)

那会更有表演性。