Ruby on Rails - 设置空的外键

4
我该如何设置外键为空?因为我想将两个表,用户和团队关联起来,但是并不强制要求一个用户必须拥有一个团队。 rails g scaffold Time name: string user: references
3个回答

5

在数据库层面上,允许字段为空。在 Time 模型中添加一个可选项,例如 - belongs_to :user, optional: true 相关文档请查看这里


只需在 Rails 模型中定义 :optional,Rails 就会理解外键不是必须的。 - taynan
默认情况下没有外键非空约束,是的。 - Yurii

5

Rails层级(模型验证)

在Rails 4.x中,当定义一个引用(references)时,对于belongs_to关联的记录是可选的。从Rails 5.x开始,此关联是必需的。

在Rails 4中,如果要使关联的记录为必需,请执行以下操作:

class Photo
  belongs_to :user, required: true
end

在Rails 5中,使关联记录变为可选的方法为:
class Photo
  belongs_to :user, optional: true
end

数据库级别

您需要确保您的迁移没有约束条件 null: false。您应该检查迁移以确保它看起来像下面这样

create_table :photos do |t|
   t.references :user, null: true, foreign_key: true
end

请注意,如果您运行类似于 generate migration AddUserRefToProducts user:references 的命令,它将自动创建 null:false。因此,您需要在迁移中进行更新。此外,如上所述,在 belongs_to 关系中设置 optional:true。 - Daniel Viglione

0

在设计表格时,不建议将与父项无关的数据放入其中。

例如: 用户可以拥有多张照片。

user table
id name 

photos table
id url user_id

如果您要存储没有用户ID的照片,那么当您想要访问特定用户的照片时,这些照片将无法检索。这就是为什么Rails不允许您存储记录,如果您已将列定义为references

您可以在此处参考问题 DHH github (rails)

在关联中添加optional: true以实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接