rails非整数主键

我有一张名为Contracts的表。 它当前的默认主键是Rails自动生成的:id字段,它是一个整数。 我希望有一个名为contractId的字段,它是一个字符串类型,并将其用作主键。 我想知道的是:

  1. 这是最佳做法吗? 这样做有什么潜在的问题吗?

  2. 我该怎么做呢

Ruby on Rails(RoR)喜欢强调约定优于配置的概念。 因此,它试图最小化配置量。 因此,如果您希望contractId是一个字符串类型,那么您可以在表中添加一个额外的字段并在任何地方使用它,并让Rails使用id作为主键。

更改PrimaryKey

生成一个新的迁移文件名称“ChangePrimaryKey”(您可以给出任何名称)。

class ChangePrimaryKey < ActiveRecord::Migration def up remove_column :table, :id # remove existing primary key rename_column :table, :udid, :id # rename existing UDID column execute "ALTER TABLE table ADD PRIMARY KEY (id);" end def down # Remove the UDID primary key. Note this would differ based on your database execute "ALTER TABLE table DROP CONSTRAINT table_pkey;" rename_column :table, :id, :udid add_column :table, :id, :primary_key end end 

如果要创建新表,则迁移可能如下所示:

 class AddTableWithDifferentPrimaryKey < ActiveRecord:Migration def change create_table :table, id: false do |t| t.string :id, null: false # other columns t.timestamps execute "ALTER TABLE table ADD PRIMARY KEY (id);" end end end 

注意您传递给表的id:false选项 - 这要求Rails不代表您创建主键列。

模型的变化

在模型中,必须添加以下行,以便Rails以编程方式查找要用作主键的列。

 class Table < ActiveRecord::Base self.primary_key = :id # rest of span end 

我希望你能做其余的事情。

如果你想看Rails真正的魔法,请不要更改默认ID 🙂

您可能知道,Rails支持从开箱即用更改主ID列:

 class Contract < ActiveRecord::Base self.primary_key = "contractId" end 

请注意,即使contractId列具有唯一索引,字符串列上的索引也总是比整数列中的索引慢一点。

此外,这不是Rails方式,可能会混淆使用此应用程序的其他开发人员。 当您的表具有非标准主键时,尤其是构建关联或路由容易出错。 恕我直言,这是避免尽可能长时间使用这种技术的一个很好的理由。