【问题标题】:Is there a cleaner way to return result of array from Rails ActiveRecord Method?有没有更简洁的方法从 Rails ActiveRecord 方法返回数组结果?
【发布时间】:2018-11-01 12:02:22
【问题描述】:

我有这个方法。我正在遍历每个客户,然后检查该客户是否有资格获得条款。我觉得这真的是低效的。我相信一个方法应该返回最后执行的操作的值,但我仍然必须这样做:

  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

但我觉得要么我误解了一个关键概念,要么我真的不明白。我可以提高效率吗?

【问题讨论】:

  • 能否提供在客户端模式下为is_terms_eligible?编写的代码?

标签: ruby-on-rails activerecord ruby-on-rails-5 rails-activerecord


【解决方案1】:

您无需自己构建数组,只需遍历所有客户端并使用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

Enumerable#each_with_object 返回您在块内创建的对象。

【讨论】:

    【解决方案2】:

    is_terms_eligible 是作为布尔值保存在数据库中的属性吗? 在这种情况下,可以这样做:

    Client.where(is_terms_eligible: true)
    

    这样会更高效。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2017-05-20
      • 2017-02-01
      相关资源
      最近更新 更多