Duplicata possible:
Que signifie la carte (&: nom) dans Ruby?
Post.all.map(&:id)
reviendra
=> [1, 2, 3, 4, 5, 6, 7, ................]
Que signifie map(&:id)
? Surtout le &
.
Le symbole &
Est utilisé pour indiquer que l'argument suivant doit être traité comme le bloc donné à la méthode. Cela signifie que si ce n'est pas encore un objet Proc, sa méthode to_proc
Sera appelée pour le transformer en un.
Ainsi, votre exemple se traduit par quelque chose comme
Post.all.map(&:id.to_proc)
qui à son tour équivaut à
Post.all.map { |x| x.id }
Il parcourt donc la collection retournée par Post.all
Et construit un tableau avec le résultat de la méthode id
appelée sur chaque élément.
Cela fonctionne parce que Symbol#to_proc
crée un Proc qui prend un objet et appelle la méthode avec le nom du symbole dessus. Il est principalement utilisé pour plus de commodité, pour économiser de la frappe.
& signifie que vous passez un bloc
Post.all est le récepteur de la méthode .map, et son bloc est transmis
Post.all.map { |item| # do something }
http://Ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map
Il parcourt le tableau et crée un lambda avec le symbole # to_proc
Cela prend tous les objets Post
et crée un tableau avec la méthode id
appelée sur chacun d'eux.
En d'autres termes, pour ActiveRecord, cela signifie que vous obtenez un tableau avec l'attribut id
pour toutes les entités Post
dans votre base de données.
C'est une astuce Ruby, qui repose sur Ruby faisant une conversion de type dynamique. Vous pouvez trouver une explication de l'astuce Symbol # to_proc ici) .