在模型上定义关系而不进行迁移会增加FK约束?

时间:2019-05-30 14:57:00

标签: ruby-on-rails ruby activerecord relation activemodel

当我们在Rails中定义两个表之间的关系时,我们通常会喜欢

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

然后,仅添加模型定义关系的第二步,该怎么办?

行得通吗?

如果是,为什么我们通常要执行步骤1?

=====

然后,在以下情况下会发生什么?

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

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

这意味着,需要关联的列,但没有FK约束。

2 个答案:

答案 0 :(得分:0)

第一步是在数据库上创建关系,因此需要在user_id表中添加列tasks

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

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

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

如果没有此列,则关联has_many将不起作用,因为数据库中用户与任务之间没有链接。

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

答案 1 :(得分:0)

实际上,您可以仅通过在表上创建FK(迁移)来设置关系,并手动管理所有查询内容(设置user_id,通过user_id进行检索等)

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

因此,您可以没有模型关联,但是没有表FK也可以。