Ruby on Rails: как перенести изменения, внесенные в модели?

Как я могу перенести изменения, внесенные в модели, в приложение Rails? Например, я знаю, что если я создам модель с помощью команды «rails g model Имя человека: строка», миграция также будет создана. Однако, если после этого шага я перейду к созданной модели «Человек» и добавлю новый атрибут, будет ли этот новый атрибут автоматически добавлен в миграцию для последующего сохранения в базе данных? Или я смотрю на это не с той стороны, и атрибут нужно добавить в миграцию, а потом добавить в модель?

С Уважением


person Rui    schedule 17.10.2012    source источник


Ответы (3)


На самом деле вы не можете «добавить» атрибут к модели, вы делаете это, создавая файл миграции и запуская его — Rails определяет, какие атрибуты есть у модели, исходя из того, какие столбцы находятся в базе данных. Однако вам необходимо добавить строку в модель, чтобы внести атрибут в белый список, если вы хотите иметь возможность обновлять его с помощью массового назначения. Вот почему вы часто будете видеть такую ​​строку в моделях ActiveRecord:

attr_accessible :name

Но это необязательно и не обязательно для добавления атрибута.

Чтобы фактически добавить новый атрибут в вашу модель, сначала создайте миграцию с помощью:

rails g migration AddAddressToPerson address:string

Это создаст файл миграции в каталоге db/migration/. (Форма «AddXXXToYYY» и «RemoveXXXFromYYY» понимается rails как «добавить (или удалить) новый столбец в модель XXX», см. документацию для получения подробной информации). В этом случае я добавил атрибут с именем address, который представляет собой строку, но вы можете изменить ее на любую, какую захотите.

Затем, чтобы действительно обновить базу данных, вам нужно запустить миграцию с помощью rake:

rake db:migrate

Наконец, если вы хотите разрешить массовое назначение этого атрибута, добавьте этот атрибут в список аргументов attr_accessible:

attr_accessible :name, :address

Это должно сработать.

person Chris Salzberg    schedule 17.10.2012
comment
К вашему сведению: ваша ссылка «массовое назначение» дает мне 404. - person Niek; 24.08.2017
comment
Спасибо, ссылка удалена. - person Chris Salzberg; 26.08.2017

Если вы добавляете новый атрибут с помощью attr_accessor, вам не нужно ничего делать с миграциями, но ваши изменения не будут сохранены в базе данных.

Если вы хотите сохранить свои изменения, вам нужно будет добавить атрибут в свою модель, используя миграция. Вы можете просто создать текстовый файл с правильной структурой, в миграции нет ничего особенного, но его намного проще генерировать, как этот rails generate migration AddLastNameFieldToUsers. Содержимое такого файла можно настроить так, чтобы оно выглядело следующим образом:

class AddLastNameFieldToUsers< ActiveRecord::Migration
  def change
    add_column :users, :last_name, :string
  end
end
person Brad Werth    schedule 17.10.2012

Вам не нужно добавлять атрибуты непосредственно в модель. Rails (на самом деле ActiveRecord) делает это автоматически. Для списка атрибутов для класса модели AR ищет таблицу с формой имени модели во множественном числе (если модель — Order, то она будет искать атрибуты в таблице заказов). Это часть конструктивной особенности под названием CoC — соглашение о конфигурации.

Итак, если вам нужно добавить атрибут, вам нужно создать миграцию, чтобы добавить это поле в столбец, как указано в других ответах.

person Prasanna Natarajan    schedule 18.10.2012