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

时间:2018-11-01 12:02:23

标签: ruby-on-rails activerecord ruby-on-rails-5 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

但是我感觉是我误解了一个关键概念,或者我真的没有理解它。我可以提高效率吗?

2 个答案:

答案 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)

那会更有表现。