rails中的'& id:Role.all.map(& id)是什么?

时间:2018-03-27 09:42:56

标签: ruby-on-rails

&:id中的Role.all.map(&:id)是什么。如果(&:id){|a| a.id}的简写,那么如何分别对任何字段执行某些方法。例如:Role.all.map(&:id.to_s)。这是错误的:

  

错误的参数类型字符串(预期的Proc)

1 个答案:

答案 0 :(得分:2)

所以&:something是进程的快捷方式。它与在do之后定义的代码块相同,只是它只能在数组中的每个项目上调用单个方法。

这三个代码示例将有效地实现* ...

Role.all.map do |role|
  role.id
end

在这一个中,doend被大括号替换......

Role.all.map{|r| r.id}

由于我们只调用该块中的一种方法,因此我们可以使用您要询问的缩短语法替换它:

Role.all.map(&:id)

除了你的问题之外,你还可以通过一个优化来获得角色的所有ID。

上面的块会调用ROLES表中的所有行,初始化Role对象,然后获取它的id属性。但是ActiveRecord提供了一种方法,它只为表中的每一行检索id属性,而不用为每一行创建一个全胖Role对象。

Role.pluck(:id)

这也适用于角色...

的查询
Role.where("name like '%user'").pluck(:id)

如果你想从Roles获得的只是一个id,这是一种更有效的方法。

* Sergio不同意他们是完全相同的,因为在运行顺序方面有一些微妙的差异......你可能不需要担心这一点。