在Rails中改变架构2

时间:2012-11-30 13:15:55

标签: ruby-on-rails rails-migrations

我需要在模式中的表中添加一些列。有人能告诉我最好的方法吗?

以下内容似乎不完整或错误,因为schema.rb文件未更新以包含新列,并且所有相应的视图文件(edit,index,new,show)都未更新以包含新列。更不用说生成的所有迁移类的膨胀。感谢

ruby script/generate migration RecordLabelToAlbums record_label:string
      exists  db/migrate
      create  db/migrate/20121130125859_record_label_to_albums.rb

创建此:

class RecordLabelToAlbums < ActiveRecord::Migration
def self.up
end

def self.down
 end
end

然后我添加了这个:

class RecordLabelToAlbums < ActiveRecord::Migration
def self.up
   add_column :albums, :record_label, :text
end

def self.down
   remove_column :albums, :record_label
end

end

我跑了:

rake db:migrate

得到了这个: Mysql ::错误:表'专辑'已经存在:CREATE TABLE albumsid int(11)DEFAULT NULL auto_increment PRIMARY KEY,created_at datetime,updated_at datetime)< / p>

1 个答案:

答案 0 :(得分:1)

您添加的代码是正确的。

该错误表明由于某种原因,您的系统似乎认为它尚未运行创建相册表的原始迁移。迁移状态(在Rails 2中)在数据库中名为schema_migrations的表中指定 - 如果这一点混淆,那么它将尝试重新运行迁移。我不确定是什么原因导致它混淆,但我记得在2008年我使用Rails 2.x时发生了几次。

表格很简单 - 您可以从SQL提示中查看其中的内容 - 我认为只是它认为已经运行的迁移的名称。

如果您不介意丢失某些数据,可以尝试rake db:rollback甚至rake db:reset返回到开头。 rake db:rollback STEP=2将回滚最近2次迁移。

如果您需要数据,请通过添加一个或多个引用app/db/migrations中可能遗漏的迁移的新记录来更正表的内容。我认为顺序很重要(格式在Rails 3中有所改变,我不记得如何)。

每当您想要添加或更改数据库架构时,请使用rails生成迁移,然后在准备就绪后运行rake db:migrate

并且只是问:你有什么方法可以转移到Rails 3.它已经存在多年了,Rails 4即将推出。如果你不接受命中和升级,你会发现自己陷入了不兼容,弃用,安全和性能问题的困境等等。