Ruby on Rails, обновление Active Record

работаю над учебником по Ruby on Rails. Я только что заметил, что пропустил одно из имен столбцов при создании миграции. Когда я пытаюсь работать с ассоциациями, я получаю эту ошибку.

 first_page = Page.new(:name => "first page", :permalink => 'first', :position => 1)
ActiveRecord::UnknownAttributeError: unknown attribute: position
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1564:in `attributes='
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1560:in `each'
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1560:in `attributes='
    from /Library/Ruby/Gems/1.8/gems/activerecord-3.0.8/lib/active_record/base.rb:1412:in `initialize'
    from (irb):5:in `new'
    from (irb):5
>> 

Мой вопрос в том, как мне обновить активную запись с правильным написанием позиции. Я изменил его в моем файле схемы.


person Nick Rivers    schedule 24.06.2011    source источник


Ответы (5)


исправьте первоначальную миграцию, чтобы она имела правильное написание, затем запустите:

$ rake db:migrate:reset

Это удалит вашу базу данных разработки (и любые данные в ней!), создаст пустую базу данных разработки и повторно запустит все определенные миграции для нее.

person rubysolo    schedule 24.06.2011
comment
Я, конечно, не рекомендовал бы это на вашем рабочем сервере, но на вашей рабочей станции для разработки (и особенно при работе с учебником) это нормально. - person rubysolo; 24.06.2011
comment
Неа. Он удаляет базу данных, затем повторно запускает все миграции, поэтому по определению база данных соответствует результату всех миграций. - person rubysolo; 24.06.2011
comment
Вы правы, я запутался между rake db:migrate:reset и rake db:reset. Извините, удалю свой комментарий. - person Adrien Coquio; 24.06.2011

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

Дополнительную информацию можно найти здесь: http://guides.rubyonrails.org/migrations.html

person mkro    schedule 24.06.2011

Если вы уже зафиксировали/отправили свою миграцию, это возможно, чем другие люди уже выполнили ее, поэтому вам лучше решить проблему с новой миграцией от @Ed Haywood:

rename_column :table, :old_column_name, :new_column_name

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

rake db:rollback

Затем исправьте миграцию и запустите ее снова rake db:migrate

Вы не должны никогда не редактировать файл schema.rb вручную, он обновляется каждый раз, когда вы запускаете миграцию. В вашем случае без редактирования это должно быть правильно, когда вы устранили проблему.

person Adrien Coquio    schedule 24.06.2011

Никогда не редактируйте схему вручную. Это не внесет никаких изменений в ваши таблицы базы данных.

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

rename_column :table, :old_column_name, :new_column_name

Чтобы ответить на ваш вопрос «Как мне обновить Active Record», вы немного неясны в своих терминах. Вы имеете в виду «Как мне обновить таблицу базы данных»? Если это так, ответом будет либо откат вашей миграции и ее исправление, либо запуск новой миграции. Любой из них будет работать, но откат может привести к потере данных в рабочем режиме (я полагаю, что это не ваш случай).

Чтобы изменить модели, вы просто открываете файл ruby ​​в текстовом редакторе и изменяете его.

person Ed Haywood    schedule 24.06.2011

Обычно я откатываю миграцию (с помощью rake db:rollback), исправляю ее и запускаю снова;

person Thiago    schedule 24.06.2011