我想知道在 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。
如果您使用边缘导轨 (4.0),您可以使用:
rails generate migration AddAddressRefToContacts address:references
正如您在docs中看到的那样。
在Rabbit中设置belongs_to,在Clown中设置has_many后,你可以使用以下命令进行迁移:
add_column :rabbit, :clown_id, :integer
编辑:请参阅下面Paulo的答案以获取更新的答案(Rails 4+)
我不确定你从哪里得到这个想法,但是没有(也从来没有)这样的语法可以用
add_column
做你想做的事情。为了获得您想要的行为,您必须执行 t.refences :clown
,正如您所说。在后台这将调用:@base.add_column(@table_name, "#{col}_id", :integer, options)
。
请参阅此处。
编辑:
我想我能明白你困惑的根源。您看到方法调用
t.reference
并假设它是一种数据类型,因为存在 t.integer
和 t.string
等调用,而这些都是数据类型。那是错误的。引用不是一种数据类型,它只是一个方法的名称,类似于 t.rename
。
要添加对 Rails 中现有模型的引用,我们必须创建迁移: 假设我们有一个 User, Post 模型 => 将用户引用添加到我们所说的帖子中
$rails 生成迁移 add_user_to_post user:references