2009-01-29 50 views
54

我有以下Rails的遷移,其完美的作品(無關件刪除):add_column爲引用(Rails)的

create_table :comments do |t| 
    t.text :body 
    t.references :post 
end 

現在我想的author列添加到我的comments表(這是用戶ID ),但我不知道該怎麼做(我試圖用execute來編寫MySql特有的語法)。

我一直在尋找add_column here哪些沒有提到references。我實際上找到了TableDefinition#references,但我不知道如何將它與add_column聲明一起使用。

這可能嗎?另外,對於MySql來說,「引用」功能是否真的不建立表之間的關係?

回答

101

雖然爲時已晚,以獲得任何點出這一點,我想我會發布的最佳方式爲後人:)

使用change_table代替create_table將列添加到已存在的桌子上,各在TableDefinition善良:

self.up do 
    change_table :comments do |t| 
    t.references :author 
    end 
end 

這似乎是微不足道的,但其他的寶石一樣設計大量使用了自己的自定義表定義的,而這樣一來,你仍然可以使用它們。

0

您可以在新遷移中添加add_column(:table, :column_name, :type, :options)列。

+0

感謝麥克。 :type和:選項是什麼? – 2009-01-29 22:36:08

20

首先,這樣做:

script/generate migration AddAuthorIdToComments 

打開生成的文件,並添加這一行:

add_column :comments, :author_id, :integer 

然後在您的模型文件:

class User < ActiveRecord::Base 
    has_many :comments, :foreign_key => "author_id" 
end 

class Comment 
    belongs_to :author, :class_name => User 
end 
+0

非常好,謝謝。當然,將列作爲整數添加並不是我所希望的,但是因爲這就是原始遷移所做的事情......感謝您概述如何在模型類中設置關係。 – 2009-01-29 22:51:20

+0

簡單的事實是,你只是不能在這種情況下使用引用,因爲只適用於表定義。是的,正如Craig所說,遷移並不關心在數據庫中設置外鍵。 – 2009-01-29 23:16:43

+0

好吧,我明白了:表定義:在列級不可用(僅在表級別)。一個問題:如果用戶的列被稱爲「ID」,它的工作原理,對吧? 「author_id」是僅在評論中的新列的名稱,對嗎? – 2009-01-29 23:43:27

2

這已經有一段時間,因爲我我看過這個,但最後我檢查了遷移不支持創建外鍵。不過幸運的是,there is a plug-in for it。我用過這個,效果很好。

34

終於得到它

add_column :locations, :state_id , :integer, :references => "states" 
66
add_reference :table_name, :reference, index: true