Rails从模型中选择

时间:2012-11-10 10:23:12

标签: ruby-on-rails database activerecord

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

User.select(:email).map(&:email)
告诉我,这是什么意思

我知道那个字符串

User.select(:email)

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

.map(&:email)

我们可以将User.select(:email)更改为User.pluck(:email)

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

3 个答案:

答案 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)

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

希望这能让您对短手方法及其块级别等效方法有所了解。