&:id
中的Role.all.map(&:id)
是什么。如果(&:id)
是{|a| a.id}
的简写,那么如何分别对任何字段执行某些方法。例如:Role.all.map(&:id.to_s)
。这是错误的:
错误的参数类型字符串(预期的Proc)
答案 0 :(得分:2)
所以&:something
是进程的快捷方式。它与在do
之后定义的代码块相同,只是它只能在数组中的每个项目上调用单个方法。
这三个代码示例将有效地实现* ...
Role.all.map do |role|
role.id
end
在这一个中,do
和end
被大括号替换......
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不同意他们是完全相同的,因为在运行顺序方面有一些微妙的差异......你可能不需要担心这一点。