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

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

в отношении

3 ответов


вы не можете действительно "добавить" атрибут к модели, вы делаете это, создавая файл миграции и запуская его-Rails выясняет, какие атрибуты модель имеет на основе того, какие столбцы находятся в базе данных. Тем не менее, вы do необходимо добавить строку в модель для белого списка атрибута, если вы хотите иметь возможность обновлять его с помощью массового назначения. Вот почему вы часто увидите такую строку в моделях 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

это должно сделать это.


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

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

class AddLastNameFieldToUsers< ActiveRecord::Migration
  def change
    add_column :users, :last_name, :string
  end
end

вам не нужно добавлять атрибуты непосредственно к модели. Rails (фактически ActiveRecord) выводит его автоматически. Для списка атрибутов класса model AR ищет таблицу с множественной формой имени модели (если модель-Order, то она будет искать атрибуты в таблице orders). Это часть функции проектирования, называемой Coc-Convention над конфигурацией.

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