有没有更简洁的方法从Rails ActiveRecord方法返回数组的结果?

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)

但我觉得要么我误解了一个关键概念,要么我真的没有得到它.我可以提高效率吗?

Mar*_*iej 5

您可以简单地遍历所有客户端,并使用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返回您在块内创建的对象.