rails非整数主键

时间:2014-05-24 14:24:25

标签: ruby-on-rails primary-key

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

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

  2. 我将如何解决这个问题

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

如您所知,Rails支持从开箱即用更改主要ID列:

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

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

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