2010-08-17 58 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已經存在」。