Ruby on Rails 活动记录查询(.each、.collect、.map ...?)

Posted

技术标签:

【中文标题】Ruby on Rails 活动记录查询(.each、.collect、.map ...?)【英文标题】:Ruby on Rails Active Record Query (.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 个邮政编码。为什么这些查询不起作用?

    Market.all.each |m| m.zipcode Market.all.zipcode m = Market.all m.each |m| m.zipcode

谢谢!

【问题讨论】:

什么是关系是邮政编码是市场或关系 我想通了...Market.pluck(:zipcode) 【参考方案1】:

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

Market.pluck(:zipcode)

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

Market.all.map(&:zipcode)

使用 Benchmark 来确定哪个更好。

【讨论】:

这可能会吃掉大量的内存。

以上是关于Ruby on Rails 活动记录查询(.each、.collect、.map ...?)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on rails 5.2 - 带有活动存储的背景图像

如何在 ruby​​ on rails 中通过 websocket 发送保持活动的数据包

ruby on rails (模型关联查询)

ruby rails3列出活动记录表

Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV

如何在 ruby​​ on rails 中编写嵌套查询?