我有2个型号:
Account
Profile
创建这些模型在数据库中创建了2个表:
accounts
profiles
现在我想添加一个关系:
我运行了以下命令:
rails g migration AddAccountToProfiles account:references
创建了以下迁移:
class AddAccountToProfiles < ActiveRecord::Migration
def change
add_reference :profiles, :account, index: true, foreign_key: true
end
end
现在我有点困惑:
为什么迁移会说:profiles
和:account
?不应该是:accounts
(复数)吗?
此外,在创建此迁移之后(或之前),我必须在相应的模型类中添加belongs_to
和has_many
吗?
作为一个附带问题,有没有办法在模型中添加belongs_to
和has_many
,并且根据该信息,rails会生成相应的迁移,而无需我手动创建{{1命令?
答案 0 :(得分:3)
根据rails documentation,命令
rails g migration AddAccountToProfiles account:references
将生成下面的迁移文件
class AddAccountToProfiles < ActiveRecord::Migration
def change
add_reference :profiles, :account, index: true, foreign_key: true
end
end
由于您指定了account:references
,因此它假定在account_id
表上创建profiles
,但您仍需要在相应的模型文件中添加关系。
当我们在迁移文件中使用:accounts
时,它指的是数据库中的表,:account
用作要添加到表中的外键的名称以及后缀{{1 }}
还有相关信息here
答案 1 :(得分:1)
迁移是正确的,因为配置文件只属于一个帐户。它不应该是帐户&#39;。迁移会将account_id
列放在配置文件表中,以便建立连接。
迁移后,您仍需要添加has_many
和belongs_to
。在Rails中,定义关系时,通常有两个步骤:1)创建数据库迁移2)定义模型类本身的关系。你需要两者兼得。在这种情况下,Rails正在查找配置文件中的account_id
列(默认外键)以建立两个模型之间的关系。
至于你的上一个问题,不,在定义has_many
后,没有办法生成迁移。您可以使用Rails生成器创建模型本身rails generate model ModelName
并定义该模型中的关系;这将在生成的模型中添加正确的belongs_to
和has_many
以及迁移。但实际上,创建迁移并根据需要手动添加belongs_to
和has_many
通常会更好,这样就不会错过任何内容。