ActiveRecord是否使用命名约定“ID”为每个表分配密钥,如果是,为什么?

我的理解是,Actice Record基于Martin Fowler在他的“企业应用程序架构模式”(Addison-Wesley,2002)一书中描述的对象 – 关系映射(ORM)模式。 这表明数据库记录与在面向对象的程序(OOP)中表示它的对象之间存在一对一的映射关系。 当Rails创建者David Heinemeier试图为他的Rails框架实现ORM时,他将其基于Fowler的模式。

这就是问题,ActiveRecord是否使用命名约定“ID”为每个表分配代理主键,如果是,为什么? 我问的原因是,使用命名约定“tablename_ID”分配一个代理主键似乎更有意义; 事实上,在创建外键时,ActiveRecord会出现这种情况。 此外,是否可以覆盖默认配置,并使用命名约定“tablename_ID”分配代理主键; 因为特别是在主键的情况下,最好不要使用共享名称,因为如果只是查看列名称,则无法识别两列ID之间的区别:ID,ID,ID。 作为一个用例示例出现这种情况会出现问题,如果我将数据从两个表导出到一个表中,则会有两个具有ID名称的列; 当我用更新导入该文档时,似乎默认情况下无法映射ID列。

看到ID是什么已经很明显了,因为它在某个表中。 您没有table_name.table_name_id但是table_name.id 。 我喜欢这种方式区分外键和主键,但不可否认,这是一个意见问题。

除非你有充分的理由使用其他任何东西,否则你应该遵守惯例。 这就是惯例的用途。 ActiveRecord为您提供了更改它的选项,如下所示:

 ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore 

这设置了全局生成主键的方式。 products.id成为products.product_id