2010-12-02 52 views
25

我想知道“正确”的方式来处理Rails中加入3添加模型参考现有的Rails的模型

鉴于现有模型两种现有类之间的关系:小丑&兔

我想添加一个从兔子到小丑的参考(belongs_to)。我开始试图通过生成一个迁移:

rails g migration AddClownToRabbits clown:reference 

,给了我一个迁移,看起来像:

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown, :reference 
    end 

    def self.down 
    remove_column :rabbits, :clown 
    end 
end 

rake db:migrate在该次迁移后我检查的SQLite3的development.db,看到一个新列:"clown" reference

我猜我期待一个"clown_id" integer列,看起来像一个迁移:

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown_id 
    end 

    def self.down 
    remove_column :rabbits, :clown_id 
    end 
end 

我确定:引用应该等同于“t.references:clown”,但我找不到文档(大惊喜)。 API说add_column:Instantiates a new column for the table. The type parameter is normally one of the migrations native types, which is one of the following: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.

...没有参考到:参考。

+1

有关文档(以及它在文档中的引用,请参阅http://guides.rubyonrails.org/getting_started.html),然后向下滚动到7.1生成模型并查看该标题下的代码段。你会看到它是*:引用*而不是*:引用*。 – iconoclast 2011-04-15 02:38:32

回答

18

当您在小丑设置在兔belongs_to的,和的has_many,你可以做一个迁移:

add_column :rabbit, :clown_id, :integer 
+0

太棒了!谢谢!我有点期待......但仍然在努力将这个......放在“裸体”迁移中?所以也许只是'轨道g迁移AddClownToRabbits`,然后手动编辑休息? – Meltemi 2010-12-02 19:48:40

5

我不确定你在哪里得到了这个想法,但是没有(并且从来没有)这样的语法去做你想要的东西add_column。如你所说,为了得到你想要的行为,你必须做t.refences :clown。在后台这将调用:@base.add_column(@table_name, "#{col}_id", :integer, options)

请参阅here

编辑:

我想我可以看到你的困惑的来源。您看到方法调用t.reference,并认为它是一种数据类型,因为存在诸如t.integert.string之类的调用,并且这些调用是数据类型。这是错误的。引用不是数据类型,它只是一个方法的名称,类似于t.rename

+0

对于混淆感到抱歉......学习......以及,这是你学习的方式。谢谢!所以,为了回答我的问题,什么是适当的生成器命令...仍然假设我需要从一个开始,因为生成器有时间戳,我认为我不应该手动创建文件名?!? `rails g migration AddClownToRabbits clown:reference`给了我上面的坏垃圾。 – Meltemi 2010-12-02 19:46:01

+0

@Meltemi:没有生成器添加引用的命令,只有列。请记住,所有的发电机确实是..很好。生成。这不是一个大问题,它不能添加引用,你只需自己做。 – ryeguy 2010-12-02 22:37:50

52

如果您使用的边缘导轨(4.0),可以使用:

rails generate migration AddAddressRefToContacts address:references 

正如你所看到的docs