Post.all.map(&:id)是什么意思?

可能重复:
在Ruby中map(&:name)是什么意思?

Post.all.map(&:id) 

将返回

  => [1, 2, 3, 4, 5, 6, 7, ................] 

map(&:id)是什么意思? 尤其是&

&符号用于表示下面的参数应该被视为给方法的块。 这意味着,如果它不是一个Proc对象,它的to_proc方法将被调用以将其转换为一个。

因此,你的例子的结果是类似的

 Post.all.map(&:id.to_proc) 

而这相当于

 Post.all.map { |x| x.id } 

因此,它迭代Post.all返回的集合,并在每个项目上调用id方法的结果构build一个数组。

这是有效的,因为Symbol#to_proc创build了一个Proc,它接受一个对象,并用该对象的名称调用该方法。 这主要是为了方便使用,以节省一些打字。

&意味着你正在通过一个块

Post.all是方法.map的接收者,并且它的块被传递

 Post.all.map { |item| # do something } 

http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map

它迭代数组并创build一个符号为#to_proc的lambda

http://ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc

这将获取所有Post对象,并创build一个数组,并在每个对象上调用id方法。

换句话说,对于ActiveRecord来说,这意味着你正在为数据库中的所有Post实体获取一个具有id属性的数组。

这是一个Ruby技巧,它依靠Ruby进行一些dynamictypes转换。 你可以在这里findSymbol#to_proc技巧的解释。