Plusieurs objets peuvent être insérés avec l'opérateur << Rails 3.1?
-
25-10-2019 - |
Question
Puis-je écrire ce qui suit ...
raw_data.categories.each do |category|
obj.categories << category
end
En ce qui suit à la place? ...
obj.categories << raw_data.categories
La solution
obj.categories |= raw_data.categories
Autres conseils
Jetez un oeil à Array#<<
et Array#push
.
Array#<<
prend une qui est annexée à la place de réseau donné. Par exemple:
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array << 'd' # => ["a", "b", "c", "d"]
Cependant, si vous passez un tableau, vous serez surpris du résultat
irb> array << ['e', 'f', 'g'] # => ["a", "b", "c", "d", ["e", "f", "g"]]
Array#push
peut manipuler des objets 1+, chacun d'eux sont annexées à la matrice.
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array.push 'd' # => ["a", "b", "c", "d"]
Toutefois, l'appel #push
avec un tableau vous donne le même résultat que #<<
.
irb> array.push ['e', 'f', 'g'] # => ["a", "b", "c", "d", ["e", "f", "g"]]
Afin de pousser tous les éléments du tableau, il suffit d'ajouter un *
avant le second tableau.
irb> array.push *['e', 'f', 'g'] # => ["a", "b", "c", "d", "e", "f", "g"]
Sur le même sujet, alors que Array#+
ne concaténer les tableaux, il permettra également à des valeurs en double.
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array += ['d'] # => ["a", "b", "c", "d"]
irb> array += ['d'] # => ["a", "b", "c", "d", "d"]
Si cela est non souhaité, l'opérateur |
renverra une union de deux tableaux, sans valeurs en double.
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array |= ['d'] # => ["a", "b", "c", "d"]
irb> array |= ['d'] # => ["a", "b", "c", "d"]