più oggetti possono essere inseriti con l'operatore << in Rails 3.1?
-
25-10-2019 - |
Domanda
Potrei scrivere quanto segue ...
raw_data.categories.each do |category|
obj.categories << category
end
Come la seguente, invece? ...
obj.categories << raw_data.categories
Soluzione
obj.categories |= raw_data.categories
Altri suggerimenti
Date un'occhiata a Array#<<
e Array#push
.
Array#<<
prende uno è allegato in atto per dato array. Ad esempio:
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array << 'd' # => ["a", "b", "c", "d"]
Tuttavia, se si passa una matrice, sarete sorpresi del risultato
irb> array << ['e', 'f', 'g'] # => ["a", "b", "c", "d", ["e", "f", "g"]]
Array#push
supporta 1+ oggetti, ciascuno dei quali vengono aggiunti alla matrice.
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array.push 'd' # => ["a", "b", "c", "d"]
Tuttavia, chiamando #push
con una serie ti dà lo stesso risultato di #<<
.
irb> array.push ['e', 'f', 'g'] # => ["a", "b", "c", "d", ["e", "f", "g"]]
Per spingere tutti gli elementi dell'array, è sufficiente aggiungere un *
prima della seconda matrice.
irb> array.push *['e', 'f', 'g'] # => ["a", "b", "c", "d", "e", "f", "g"]
In una nota correlata, mentre Array#+
non concatenare gli array, permetterà anche i valori duplicati.
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array += ['d'] # => ["a", "b", "c", "d"]
irb> array += ['d'] # => ["a", "b", "c", "d", "d"]
Se questo è indesiderato, l'operatore |
restituirà un unione di due array, senza valori duplicati.
irb> array = %w[ a b c ] # => ["a", "b", "c"]
irb> array |= ['d'] # => ["a", "b", "c", "d"]
irb> array |= ['d'] # => ["a", "b", "c", "d"]