【问题标题】:Ruby on Rails Active Record Query (.each, .collect, .map ...?)Ruby on Rails 活动记录查询(.each、.collect、.map ...?)
【发布时间】:2012-12-18 01:25:32
【问题描述】:

这是我数据库中一项的示例:

Market id: 1, name: "Independence Park (Independently Run Farmers Market...", address: "3945 N. Springfield Ave., Chicago, IL", zipcode: "60618", created_at: "2013-01-01 21:22:24", updated_at: "2013-01-01 21:22:24"

我要做的就是列出我数据库中所有条目的 43 个邮政编码。为什么这些查询不起作用?

  1. Market.all.each { |m| m.zipcode }
  2. Market.all.zipcode
    • m = Market.all
    • m.each{ |m| m.zipcode }

谢谢!

【问题讨论】:

  • 什么是关系是邮政编码是市场或关系
  • 我想通了...Market.pluck(:zipcode)

标签: ruby-on-rails ruby sqlite activerecord active-record-query


【解决方案1】:

如果你想要的只是一组邮政编码,我建议你试试这个:

Market.pluck(:zipcode)

【讨论】:

    【解决方案2】:

    其他答案已经指出了做你想做的事情的正确方法,但没有解释为什么你的其他尝试没有奏效(从技术上讲,这是你问的问题)。

    尝试 1 和 3 不起作用的原因是 each 没有返回任何内容,它的唯一用途是遍历一组记录并对它们执行操作(例如更新它们或使用一些数据调用外部服务)。将 each 替换为 map 将修复它们,因为 map 使用块的返回值来返回值数组。这有一个缺点,因为map 是一个数组方法,因此必须先将所有记录加载到内存中才能找到值。

    尝试 2 不起作用,因为您尝试调用 ActiveRecord::Relation (all) 上的字段名称,因此您最终会引发 NoMethodError。

    最简洁的解决方案,也是已经指出的一个,是使用pluck,它不仅返回请求字段的所有值,而且在数据库查询级别这样做,所以你调用应该更多高效。

    【讨论】:

      【解决方案3】:

      您还可以执行以下操作,它会返回一个邮政编码数组:

      Market.all.map(&:zipcode)
      

      使用 Benchmark 来确定哪个更好。

      【讨论】:

      • 这可能会吃掉大量的内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      相关资源
      最近更新 更多