Как установить атрибут для массива в модели?

Можете ли вы научить меня, как установить атрибут для Array in Model?

Я пробовал это, но когда я использую метод массива, как push, eachЯ получил ошибку undefined method `push' for nil:NilClass

Моя миграция выглядит так:

class CreateContacts < ActiveRecord::Migration
  def change
    create_table :contacts do |t|
      t.string :name
      t.string :email
      t.string :email_confirmation
      t.integer :city_ids, array: true
      t.text :description

      t.timestamps
    end
  end
end

Я хотел бы установить атрибут city_ids в массив.

2 ответа

Одна важная вещь, на которую следует обратить внимание при взаимодействии с массивом (или другими изменяемыми значениями) в модели. ActiveRecord в настоящее время не отслеживает "деструктивные" или изменения на месте. К ним относятся перемещение и извлечение массива, продвижение объектов DateTime. пример

 john = User.create(:first_name => 'John', :last_name => 'Doe',
  :nicknames => ['Jack', 'Johnny'])

john = User.first

john.nicknames += ['Jackie boy']
# or
john.nicknames = john.nicknames.push('Jackie boy')
# Any time an attribute is set via `=`, ActiveRecord tracks the change
john.save

Ссылка - ссылка

Вам нужно установить значение по умолчанию. В противном случае атрибут nilДо тех пор, пока вы не дадите ему значение:

  t.integer :city_ids, array: true, default: []

Или вам нужно дать ему значение, прежде чем пытаться его использовать:

c = City.find(...)

c.city_ids ||= []

c.city_ids.push(...)
Другие вопросы по тегам