2010-08-17 70 views
5

我有一个Rails应用程序一个sqlite3的分贝以下架构remove_column不列删除或提供在轨

ActiveRecord::Schema.define(:version => 20100816231714) do 

    create_table "comments", :force => true do |t| 
    t.string "commenter" 
    t.text  "body" 
    t.integer "post_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "posts", :force => true do |t| 
    t.string "name" 
    t.string "title" 
    t.text  "content" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "tags", :force => true do |t| 
    t.string "name" 
    t.integer "post_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

end 

我一开始的帖子任何错误:的has_many关系与标签,以便每个标签都有一个POST_ID参考。

我现在想这种关系更改为“has_and_belongs_to_many”,我知道我必须要创建连接的表等....这不是一个问题,并正在

在问题出现时,我尝试从标签表中删除post_id表单。我的迁移是这样的:

class RemoveFieldsToTags < ActiveRecord::Migration 
    def self.up 
    remove_column :tags, :post_id 
    end 

    def self.down 
    add_column :tags, :post_id, :references 
    end 
end 

当我运行耙分贝:迁移和耙分贝:迁移:后续版本=没有任何反应,当我运行耙分贝:迁移:缩小版本=我得到柱:

SQLite3::SQLException: duplicate column name: post_id: ALTER TABLE "tags" ADD "post_id" references 

任何人都知道发生了什么事?

回答

4

像avaynshtok上面提到的,这听起来像铁轨认为你的迁移是最新的(如,他们都得到了应用),但你自己不是(在POST_ID列仍然是标签上的表)。

一个共同的“处理方法”来处理这种情况,而不必擦拭你的数据库注释掉迁移的“向下”方法和运行

rake db:migrate:redo 

鉴于“向下”已被注释掉,它将不会尝试再次添加列,因此它将继续重新应用'up'方法,删除'post_id'列。然后你可以删除'down'方法的评论,它应该都是好的。

PS。您也可以考虑使用'has_many:through'类型的关系,而不是'has_and_belongs_to_many'。

+0

欢呼的答案,我开始使用has_many:through关系,但决定增加了一些不必要的复杂性(我将简单化),关于这种关系的官方立场似乎是'当你想保留时使用关于连接的信息'例如。关系的时间是作出,结果等... – zode64 2010-08-17 18:09:29

+0

这工作的方式,谢谢 – zode64 2010-08-17 19:35:33

5

听起来好像Rails认为你的数据库是最新的(当你运行db:migrate时没有任何反应)。如果您在应用之后修改了迁移(在开发过程中通用),则可以进入此状态。

你是否尝试过运行数据库:迁移新鲜的数据库(注意这将擦除你的数据库)?

rake db:drop db:create db:migrate 
0

我也有类似问题的任择议定书,但必须手动删除该数据库,然后运行

耙分贝:创建分贝:迁移


耙分贝:迁移:重做

耙分贝:滴

并没有为我工作,因为它不停地说 “DB/test.sqlite3已经存在”。