2011-12-02 54 views
0
create table foo (id auto increment primary key, name varchar(255)) 

期间递增的主键我写上self.up创建一个新的记录,并丢弃它self.dropdelete(:id => 1)一个简单的Rails迁移脚本。如果我执行db:migrate,会创建一个id = 1的新条目,如果我回滚它,它将被删除。如果我使用主键id = 2创建记录并且我的drop脚本在回滚时失败,则会再次迁移/丢弃时会出现问题。如何处理自动迁移

主键每次都是相同的,这是非常重要的,因为我有其他依赖关系。什么应该是正确的方式来处理这个问题。

回答

0

我认为处理它的正确方法是删除表而不是删除记录。当您在self.up方法中创建表时,您可以对其执行删除操作。

def down 
    drop_table :system_settings 
    end 
2

您不应该使用迁移来添加种子数据,而应该使用db/seed.rb文件。当你做rake db:reset时,这将重新安装你的种子数据,这也将重置你的ID计数器,因此数据将具有可预测的ID。通过迁移添加的数据在执行rake db:reset时不会重新加载!

+0

这是否会删除并重新创建种子数据,这可能会失败,因为会有其他记录对种子数据具有外键依赖关系。 – priya

+0

是的,db:reset将删除并重新创建仅包含种子数据的数据库。因此,在您想要保存数据库的数据的生产环境中,这不是一种方法。 – harald

0

这样做的事情是MySQL中的AUTO_INCREMENT选项。我不认为ActiveRecord可以让你关闭它。但是,您可以通过删除MySQL中的id字段的AUTO_INCREMENT值来关闭它(您必须为此执行MySQL查询。)

第二种想法是,在数据库中维护一些孤立记录。我不认为这是正确的做法。尝试从Rails控制台中删除这些东西,并使用正确设置的模型在母记录被删除时删除相关记录,然后使用一些rake脚本或其他方式再次添加数据并设置所需的关联。