为什么Rails隐藏了id列的存在?

我不太明白需要隐藏Rails中id列的存在。 它既不反映在migration文件中,也不反映在schema.rb文件中。 新手无法知道默认情况下已创建名为id的列作为primary key 。 除非他们去检查数据库中表的实际模式( rails dbconsole )。

我可以在迁移文件和schema.rb看到默认包含的timestamps宏,它包含两个字段created_atupdated_at 。 在这里,开发人员至少得到一个线索。 Rails也可以为id列做同样的事情。 但事实并非如此。

为什么id列周围的秘密? 它是着名的convention over configuration的一部分吗? 或者它是所有MVC框架的标准吗?

在数据库设计中,通常认为数字id是首选,因为

  • 它们更容易索引,因此在创建链接(外键)时更容易“跟随”或检查。
  • 编辑/更新记录时,您有一个唯一(高效)的标识符

因此,建议始终为所有表提供唯一的数字键。

现在,这个数字键对您的应用程序没有任何意义,它是数据库层的“实现细节”。 还要确保每个表都有一个id,除非你明确要求不这样做。

我认为这确实属于“约定优于配置”nomer:如果每个表应该有一个,为什么要为每个表明确指定一个id。

时间戳是不同的:这对于某些表来说很有意思,但对于相同的表,它根本不重要。 它还取决于您的应用程序。

请注意,这与MVC完全无关。 MVC中的M是数据的容器,但在MVC中,如何填充模型实际上并不重要。 换句话说:ORM部分不是MVC的一部分。 您将看到在大多数MVC实现中没有ORM,或者肯定没有像Rails那样紧密集成。

所以简而言之:imho从迁移中省略’id’并不是一个秘密,它只是为了让生活更轻松,节省更多的打字, 确保你遵循一个好的约定,除非你明确不愿意。

这可能是因为关系数据库倾向于使用整数主键,否则会引入复杂性。 我想它隐藏在rails中的原因是创建具有整数主键的表不需要任何特殊配置,并且必须将其写入rails迁移会邀请没有经验的开发人员使用它(这可能不是一个好主意)。

另外,我认为rails试图抽象出数字id这样的东西,如果你想在迁移中创建关联而不需要指定外键,你可以简单地写出你想要将表关联到的对象的名称。

我从来没有想过id字段,因为几乎每张桌子都有一个id ….

查看他们所说的迁移文档:

还将隐式添加名为id的主键列,因为它是所有Active Record模型的默认主键。 时间戳宏添加了两列,created_at和updated_at。 这些特殊列由Active Record自动管理(如果存在)。

如果要检查表列,只需转到rails控制台并键入Model.column_names

我认为很明显,如果你不添加主键,那么rails会为你添加一个通用键,以便它可以索引你的记录并控制它,所以基本上它没有说明会有一个ID字段,因为我不认为这必须是必要的,而是在您不提供主键的情况下可选。

这是一个Rails惯例,隐藏我的属性以阻止和消除玩它的诱惑。

使用auto_increment自动生成id attr,以对数据进行广告规范化(使每条记录都是唯一可访问的)。 注入自己的值最终会破坏并打破ActiveRecord的魔力。