在某些视频中,我看到下一个字符串:
User.select(:email).map(&:email)
告诉我,这是什么意思
我知道那个字符串
User.select(:email)
只从数据库中选择电子邮件列,但我不明白是什么意思
.map(&:email)
我们可以将User.select(:email)
更改为User.pluck(:email)
因为从教程我明白这是相同的方法。这是真的吗?
答案 0 :(得分:1)
map(&:email)
将您的User
数组映射到仅包含用户电子邮件的字符串地图。
Array.map遍历当前数组,并通过调用参数块创建一个新数组,并将结果存储在新数组中。它等同于:
new_array = []
Users.select(:email).each do |user|
new_array << user.email
end
答案 1 :(得分:1)
User.select(:email)
返回User
个对象的数组。表达式
User.select(:email).map(&:email)
仅选择该对象的电子邮件属性。所以你最终得到了一系列电子邮件字符串。那最后和
一样User.pluck(:email)
但由于这个原因,它与User.select(:email)
不同。
很好地查看documentation of pluck。
答案 2 :(得分:1)
我想你已经知道地图(和电子邮件)会给你什么,我想你是在问及如何以及为什么,因为当我第一次看到这个时,它就是同样的事情。 所以这是伏都教给你的结果中更高级的红宝石魔法之一:)
基本上让我们看一下map函数,其本身最基本的用法是接受一个块级命令。在迭代之后,获取默认返回值并将其放入数组中供您使用。例如,让我们看看这个
list = User.all
所以我们得到一个用户对象列表[用户模型,用户模型]等。
list.map do |user|
user.email
end
如果您在IRB或Rails控制台中运行此块,则会收到[“some@email.here,alother@email.here”]等。 所以我们抓住这个结果并将其分配给变量
email_list = list.map do |user|
user.email
end
现在email_list应该等于[“some@email.here,other@email.here”] 现在您获得了map函数的背景,让我们深入研究它可以接受参数的各种方法
list.map {|user| user.email }
这与上面相同,但使用花括号括起块逻辑
list.map(&:email)
这是上述的简写,通过为您定义块,您只需提供您希望在块项上运行的子函数。
希望这能让您对短手方法及其块级别等效方法有所了解。