Можно ли вставить несколько объектов с помощью оператора << в Rails 3.1? - PullRequest
3 голосов
/ 29 ноября 2011

Могу ли я написать следующее ...

      raw_data.categories.each do |category|
          obj.categories << category
      end

Как следующее вместо этого? ...

      obj.categories << raw_data.categories

Ответы [ 2 ]

9 голосов
/ 29 ноября 2011

Взгляните на Array#<< и Array#push.

Array#<< берет тот, который добавляется на место к данному массиву.Например:

irb> array = %w[ a b c ]       # => ["a", "b", "c"]
irb> array << 'd'              # => ["a", "b", "c", "d"]

однако, если вы передадите массив, вы будете удивлены результатом

irb> array << ['e', 'f', 'g']  # => ["a", "b", "c", "d", ["e", "f", "g"]]

Array#push может обрабатывать 1+ объектов, каждый из которыхдобавлен к массиву.

irb> array = %w[ a b c ]         # => ["a", "b", "c"]
irb> array.push 'd'              # => ["a", "b", "c", "d"]

Однако, вызов #push с массивом дает тот же результат, что и #<<.

irb> array.push ['e', 'f', 'g']  # => ["a", "b", "c", "d", ["e", "f", "g"]]

Для того, чтобы выдвинуть все элементыв массиве просто добавьте * перед вторым массивом.

irb> array.push *['e', 'f', 'g']  # => ["a", "b", "c", "d", "e", "f", "g"]

В связанной заметке, хотя Array#+ объединяет массивы, она также допускает дублирование значений.

irb> array  = %w[ a b c ]         # => ["a", "b", "c"]
irb> array += ['d']               # => ["a", "b", "c", "d"]
irb> array += ['d']               # => ["a", "b", "c", "d", "d"]

Если это нежелательно, оператор | вернет объединение двух массивов без повторяющихся значений.

irb> array  = %w[ a b c ]         # => ["a", "b", "c"]
irb> array |= ['d']               # => ["a", "b", "c", "d"]
irb> array |= ['d']               # => ["a", "b", "c", "d"]
9 голосов
/ 29 ноября 2011
obj.categories |= raw_data.categories 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...