Как установить атрибут для массива в модели?
Можете ли вы научить меня, как установить атрибут для 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(...)