0

在一些视频中,我看到了下一个字符串:

User.select(:email).map(&:email)

请告诉我这是什么意思

我知道那个字符串

User.select(:email)

仅从数据库中选择电子邮件列,但我不明白是什么意思

.map(&:email)

User.select(:email)我们可以改成User.pluck(:email)

因为从教程中我明白那是相同的方法。这是真的?

4

3 回答 3

1

map(&:email)您的 s 数组User映射到仅包含用户电子邮件的字符串映射。

Array.map 遍历当前数组,并通过调用参数块创建一个新数组,并将结果存储在新数组中。它与此等效:

new_array = []
Users.select(:email).each do |user|
  new_array << user.email
end
于 2012-11-10T10:25:05.163 回答
1

User.select(:email)

正在返回一个对象数组User。表达方式

User.select(:email).map(&:email)

仅选择该对象的电子邮件属性。所以你最终得到了一系列电子邮件字符串。最后与

User.pluck(:email)

User.select(:email)但由于这个原因,它是不同的。

另请参阅 pluck 的文档

于 2012-11-10T10:39:19.777 回答
1

我想你已经知道 map(&:email) 给了你什么,我假设你在问如何以及为什么,因为当我第一次看到这个时,这就是同样的事情。所以这是巫毒教的结果回馈给你的更高级的红宝石魔法之一:)

基本上让我们看一下map函数,它本身最基本的用法就是接受块级命令。在迭代之后,获取默认返回值并将其放入一个数组中供您使用。例如,让我们看看这个

list = User.all 

所以我们得到一个用户对象列表[用户模型,用户模型]等。

list.map do |user|
  user.email
end

如果你在 IRB 或 Rails 控制台中运行这个块,你会得到 ["some@email.here, another@email.here"] 等。所以让我们捕获这个结果并将它分配给一个变量

email_list = list.map do |user|
  user.email
end

现在 email_list 应该等于 ["some@email.here, another@email.here"] 现在您已经了解了 map 函数的背景,让我们深入研究它可以接受参数的各种方式

list.map {|user| user.email }

这和上面的一样,但是使用花括号来包围块逻辑

list.map(&:email)

这是上述内容的简写,通过为您定义块,您只需提供您希望在块项目上运行的子函数。

希望这能让您对速记方法及其块级等价物有所了解。

于 2012-11-10T11:23:12.450 回答