2013-05-15 1 views
2

Есть ли способ создать миграцию с изменениями, внесенными вами в модель? Например, у меня есть модель Foo с bar и oof атрибутами, которые уже сохраняются в db. Я хочу добавить атрибут rab в Foo. Есть ли способ добавить этот атрибут в класс и создать миграцию, которая распознает это изменение?Есть ли драгоценный камень, который позволяет создавать миграции на основе изменений в модели?

Я хотел бы добавить к :rabattr_accessible в файле модели Foo, и эта магическая функция будет создавать миграцию как автоматически следующее:

class AutoMigrate < ActiveRecord::Migration 
    def change 
    add_column :foo, :rab, :string 
end 

Спасибо.

Вот другой поток я нашел с деталями Rails - Generating migration script from model

Похоже DataMapper может быть решение, я ищу, но я hesitent, чтобы перейти от ActiveRecord.

https://github.com/datamapper/dm-rails

+0

Я думаю, что нет, кроме того, новое поле db может быть attr_protected, но простая переменная экземпляра может быть attr_accessible. Это не критерий – apneadiving

+0

'attr_protected' и' attr_accessible' предназначены для обеспечения безопасности массового присвоения. И они уходят в Rails 4, поэтому я не стал их использовать сейчас - вместо этого используйте Strong Parameters или Permitters (которые используют Strong Parameters), поскольку они работают в Rails 3.1+. Сильные параметры включены в Rails 4, поэтому сильные_параметры не должны добавляться в Gemfile при использовании Rails 4. –

+0

Не говоря о том, чтобы не использовать DataMapper, но, пожалуйста, прочитайте мой ответ и прочитайте руководство Rails: http://guides.rubyonrails.org/Вы можете создать перенос для существующих вещей, которые вы сделали с БД, но тогда вам нужно будет создать записи в БД в таблице schema_migrations, указав, что они уже были запущены при использовании ActiveRecord, который является стандартным ORM для Rails. Существует более простой способ сделать то, что вы хотите, это 'config.active_record.schema_format =: sql'. –

ответ

3

Нет, и это немного назад, чтобы как Rails рассчитывает работать.

Одна проблема в том, что вы часто будете иметь attr_accessible свойства, не предполагается сохраняться, например, поле ввода пароля используется для генерации сохранялось, зашифрованный пароль.

+0

Это адекватный ответ @Dave Newton, спасибо. Есть ли способ сделать это, сделав атрибут существенным в модели? –

+0

@JoeEssey Meh; вы могли бы создать свой собственный dodad 'attr_xxx', который использовал материал' attr_accessible' по умолчанию, а также «пометил» его как «существенный», но вам также нужно будет сохранить, добавлено ли оно ранее в предыдущую миграцию , слишком. IMO, если вы добавляете постоянные attrs, делайте это по Rails, через миграцию. –

0

Я не знаю ни одного драгоценного камня, как это, или даже, как можно было бы реализовать. Его обратная сторона конвенции. Также основная проблема заключается в том, как узнать тип атрибута от добавления чего-то к attr_accessible. нет способа узнать, есть ли строка или плавать, и т. д. Просто следуйте за соглашением и не редактируйте schema.rb file.

Просто генерировать новую миграцию, чтобы добавить атрибут в модели Foo

rails generate migration add_rab_to_foo rab:string 

затем запустить миграцию

rake db:migrate 
1

Как Дэйв сказал, вы ошибаетесь в некотором роде.

ActiveRecord создает методы для каждого существующего столбца в базе данных, например. если у вас есть столбец foobar в таблице, соответствующей модели, то у вас есть метод foobar и метод foobar=(value).

Если вы начинаете с нового приложения Rails, вы можете и должны, вероятно, создать схему с помощью миграции, и вы можете use the migration generators built into Rails for that, and then tweak the migration files as needed и запустить rake db:migrate.

Если вы вносите изменения в базу данных за пределами Rails, то вы уже можете получить доступ к ней через ActiveRecord, по большей части.

Если вы делаете rake db:schema:dump, вы уже сможете увидеть столбцы из базы данных.

Если вы хотите, чтобы у вас была резервная копия схемы (включая SQL, которая не является частью существующей миграции), рассмотрите возможность использования опции config.active_record.schema_format = :sql в config/application.rb.Затем вместо db/schema.rb вы получите db/structure.sql с созданием схемы SQL, сбрасываемым в этот файл, когда вы делаете rake db:schema:dump.

На ваш комментарий в ответе Дейва вы также хотели бы сделать требуемый атрибут. Вы можете сделать это с помощью миграции, которая изменяет колонку, чтобы сделать ее недействительной. Вы также можете добавить валидацию к модели, чтобы потребовать ее. Если вы учитесь и не должны их использовать, не используйте attr_protected и attr_accessible. В Rails 4 отключена защита от массового присвоения, и вы сбиты с толку, думая, что они связаны с тем, что требуется (вместо этого вы должны использовать Strong Parameters - см. Мои комментарии к вашему вопросу выше). Обязательные поля обычно должны обрабатываться с помощью ограничения БД сначала (с нулевыми или нет, а возможно, с ограничениями/триггерами), а затем с помощью валидации - на стороне сервера с помощью проверки ActiveRecord, а затем на стороне клиента в HTML/Javascript.