在没有迁移的模型上定义关系,这会增加 FK 约束?

Define relation at model without migration which adds FK constraint?

当我们在 Rails 定义两个表之间的关系时,我们通常会这样做

  1. 运行 用于生成迁移文件的命令,如 rails g migration AddUserToTask user:belongs_to
  2. 并在模型中添加一行来定义关系类型,例如 has_many :users

那么,只做第 2 步怎么样,它只是在模型中添加用于定义关系的行?

有效吗?

如果是这样,为什么我们通常做step1?

=====

而且,在下面的情况下会发生什么?

  1. 只是创建关联所必需的列(如user_id)。并且此列在 sql 级别没有 FK 约束。

  2. 并在模型中添加行以定义关系类型,例如 has_many :users 与在步骤 1 中创建的列名称

也就是说,有需要关联的列,但是没有外键约束。

第一步是在数据库中创建关系,因此它是在 tasks table.

中添加列 user_id

在此之后,当您保存任务时,例如

> task = Task.first
> task.user = User.first
> task.save

它将用户的 ID 保存在 tasks table 的 user_id 字段中。

如果没有此列,关联 has_many 将不起作用,因为数据库中的用户和任务之间没有 link。

此外,在您的示例迁移中,正确的关联应该是将 has_many :tasks 添加到 User 模型,并在 Task 模型中添加 belongs_to :user

实际上,您可以通过在 table(迁移)上创建 FK 来设置关系,并手动管理所有查询内容(设置 user_id,通过 [=10 检索=], 等等).

在 运行 迁移之后,您在依赖 Rails 完成所有艰苦工作的模型上设置关联。

所以,你可以没有模型协会,但不能没有 table FK。