我有一张名为Contracts的表。它当前的默认主键是Rails自动生成的:id字段,它是一个整数。我希望有一个名为contractId的字段,它是一个字符串类型,并将其用作主键。我想知道的是:
这是最佳做法吗?这样做有什么潜在的问题吗?
我将如何解决这个问题
答案 0 :(得分:4)
Ruby on Rails(RoR)喜欢强调约定优于配置的概念。因此,它试图最小化配置量。 因此,如果您希望 contractId 是一个字符串类型,那么您可以在表中添加一个额外的字段并在任何地方使用它,并让Rails使用id作为主键。
生成一个新的迁移文件名称“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:)
答案 1 :(得分:3)
如您所知,Rails支持从开箱即用更改主要ID列:
class Contract < ActiveRecord::Base
self.primary_key = "contractId"
end
请注意,即使contractId
列具有唯一索引,字符串列上的索引也总是比整数列中的索引慢一点。
此外,这不是Rails方式,可能会混淆使用此应用程序的其他开发人员。当您的表具有非标准主键时,尤其是构建关联或路由容易出错。恕我直言,这是避免尽可能长时间使用这种技术的一个很好的理由。