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

问题描述 投票:0回答:4

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

鉴于现有模型:小丑和兔子

我想添加从兔子到小丑的引用(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

我确信 :reference 应该等同于“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.

...没有 reference 到:reference。

ruby-on-rails migration
4个回答
64
投票

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

rails generate migration AddAddressRefToContacts address:references

正如您在docs中看到的那样。


18
投票

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

add_column :rabbit, :clown_id, :integer

编辑:请参阅下面Paulo的答案以获取更新的答案(Rails 4+)


5
投票

我不确定你从哪里得到这个想法,但是没有(也从来没有)这样的语法可以用

add_column
做你想做的事情。为了获得您想要的行为,您必须执行
t.refences :clown
,正如您所说。在后台这将调用:
@base.add_column(@table_name, "#{col}_id", :integer, options)

请参阅此处

编辑:

我想我能明白你困惑的根源。您看到方法调用

t.reference
并假设它是一种数据类型,因为存在
t.integer
t.string
等调用,而这些都是数据类型。那是错误的。引用不是一种数据类型,它只是一个方法的名称,类似于
t.rename


0
投票

要添加对 Rails 中现有模型的引用,我们必须创建迁移: 假设我们有一个 User, Post 模型 => 将用户引用添加到我们所说的帖子中

$rails 生成迁移 add_user_to_post user:references

© www.soinside.com 2019 - 2024. All rights reserved.