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 发送保持活动的数据包