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】:

我认为您可能对optionalbelongs_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,但它不是必须的。项目可以与包含NULLshopping_cart_id 列一起存在。

真的null: trueoptional 没有直接关系。数据库级别的可空性由迁移文件中的内容确定。在belongs_to 关系中出现foreign_key(例如属于购物车的商品)更多地与模型代码有关,而不是与迁移代码有关。

【讨论】:

首先,谢谢,这正是我想要的!我想我应该在上下文中提供以下内容:***.com/questions/27589399/… -----> 这是我发现有人建议(或者我误读,可能性是两倍)可能将 optional 用作迁移的一部分的地方。 啊,如果你用 14 个赞来谈论这个答案,那么“在article 模型中”的部分就是关键所在。您可以在 Article.rb 中使用 optional(例如 belongs_to :author, optional: true)来指示文章记录上的 author_id 列可能是 null 啊哈。非常感谢!

以上是关于Rails 中的迁移,空选项和可选选项之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

雄辩:定义模型和迁移中的关系之间的区别

什么是命令的首选项和可选项?

Vue:空选项应保持可选状态

swift 可选项(Optional)

Python技法:用argparse模块解析命令行选项

PostgreSQL:在 Rails 迁移中使用 add_column "after" 选项