我正在学习Rails,并且发现这些细节会让你在未来陷入困境。由于我正在创建一个非常简单的存储,在进行迁移时,我有几个belongs_to,它们是可选的对象关系。当我阅读试图更好地理解null在这里:
理解rails迁移语句(:null =>假)
我突然想到,使用null: true将允许该列为空,并且我找不到任何信息/问题来解决
之间的区别:create_table :items do |t|
...
t.belongs_to :shopping_cart, null: true
...
end
和
create_table :items do |t|
...
t.belongs_to :shopping_cart, optional: true
...
end
我应该做什么这种可选的关系,我新Ruby/Rails但"约定优于configuration"让我想知道怎么做才对。非常感谢!
我认为你可能会困惑如何optional
在belongs_to
工作关系。
在迁移文件中,您告诉数据库如何构建表。什么列被调用,它们持有什么样的数据,NULL
是否是一个可接受的值,等等。这通过Rails使用的ActiveRecord ORM直接与你的模型代码相关。
因此,在迁移中,null: true
意味着在数据库级别上NULL
是给定列的可接受值。null: false
将意味着NULL
是不可接受的,并且您总是期望在那里存储一些东西。一般来说,null: false
与默认值一起使用,这样即使在创建记录时没有指定,列中也总是有一个值。
optional
在模型代码本身中用于告诉ActiveRecord期望belongs_to
关系,但它可能不存在,这没关系。在您的例子中,它看起来像这样:
class Item < ApplicationRecord
belongs_to :shopping_cart, optional: true
end
这意味着一个项目可能有shopping_cart_id
出现在数据库中,但是它没有。项可以存在于包含NULL
的shopping_cart_id
列。
实际上null: true
和optional
没有直接关系。数据库级别的可空性由迁移文件中的内容决定。在belongs_to
关系中foreign_key的存在,比如属于购物车的物品,更多的是关于模型代码,而不是关于迁移代码。