rails创建2个现有模型之间的关系

时间:2016-06-03 14:10:11

标签: ruby-on-rails

我有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_tohas_many吗?

作为一个附带问题,有没有办法在模型中添加belongs_tohas_many,并且根据该信息,rails会生成相应的迁移,而无需我手动创建{{1命令?

2 个答案:

答案 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_manybelongs_to。在Rails中,定义关系时,通常有两个步骤:1)创建数据库迁移2)定义模型类本身的关系。你需要两者兼得。在这种情况下,Rails正在查找配置文件中的account_id列(默认外键)以建立两个模型之间的关系。

至于你的上一个问题,不,在定义has_many后,没有办法生成迁移。您可以使用Rails生成器创建模型本身rails generate model ModelName并定义该模型中的关系;这将在生成的模型中添加正确的belongs_tohas_many以及迁移。但实际上,创建迁移并根据需要手动添加belongs_tohas_many通常会更好,这样就不会错过任何内容。