向现有Rails模型添加模型引用

时间:2010-12-02 19:28:11

标签: ruby-on-rails migration

我想知道在Rails 3中添加两个现有类之间关系的“正确”方法。

鉴于现有型号:小丑&兔

我想从Rabbit添加一个引用(belongs_to)到Clown。我首先尝试生成迁移:

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.

...没有参考:参考。

3 个答案:

答案 0 :(得分:57)

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

rails generate migration AddAddressRefToContacts address:references

正如您所见docs

答案 1 :(得分:19)

在Rabbit中设置belongs_to并在Clown中设置has_many后,您可以使用以下命令进行迁移:

add_column :rabbit, :clown_id, :integer

答案 2 :(得分:5)

我不确定你在哪里有这个想法,但是没有(也从来没有)这样的语法可以用add_column做你想做的事。为了获得您想要的行为,您必须按照您的说明进行t.refences :clown。在后台,这将调用:@base.add_column(@table_name, "#{col}_id", :integer, options)

请参阅here

编辑:

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