Rails 中的迁移,空选项和可选选项之间的区别?
Posted
技术标签:
【中文标题】Rails 中的迁移,空选项和可选选项之间的区别?【英文标题】:Migrations in Rails, difference between null and optional options? 【发布时间】:2021-12-02 05:03:38 【问题描述】:我正在努力学习 Rails,并发现细节是你将来真正最终会陷入困境的地方。当我创建一个非常简单的商店时,进行迁移时我有一些属于可选的对象关系。当我在这里阅读时试图更好地理解 null 时:
Understanding rails migration statement (:null => false)
我突然想到,使用 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 的新手,但“约定优于配置”让我想了解正确的方法。非常感谢!
【问题讨论】:
也许我在这样的迁移中从未遇到过optional
,但是您在哪里找到了建议使用optional
的指南?
这里! ***.com/questions/27589399/…(免责声明,我可能只是误读了链接的堆栈帖子)
【参考方案1】:
我认为您可能对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(例如属于购物车的商品)更多地与模型代码有关,而不是与迁移代码有关。
【讨论】:
首先,谢谢,这正是我想要的!我想我应该在上下文中提供以下内容:***.com/questions/27589399/… -----> 这是我发现有人建议(或者我误读,可能性是两倍)可能将 optional 用作迁移的一部分的地方。 啊,如果你用 14 个赞来谈论这个答案,那么“在article
模型中”的部分就是关键所在。您可以在 Article.rb 中使用 optional(例如 belongs_to :author, optional: true
)来指示文章记录上的 author_id
列可能是 null
。
啊哈。非常感谢!以上是关于Rails 中的迁移,空选项和可选选项之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章