2009-01-29 48 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