【问题标题】:rails non-integer primary keyrails 非整数主键
【发布时间】:2014-07-13 19:24:27
【问题描述】:

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

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

  2. 我会怎么做

【问题讨论】:

  • 就 Rails 而言,这不是“最佳实践”。 id 的名称和类型以及其他语义(例如自动递增)在整个代码的许多地方都被假定。当然,正如这里的好答案所表明的那样,您可以绕过其中的一些约定——主要是为了支持原本不打算供 Rails 使用的遗留数据库。几乎一切皆有可能;如果可以避免,并非一切都是可取的。 (我是在寻找一种方法来处理更新不遵循惯例的旧应用程序时说的——每一步都是一场斗争:-)

标签: ruby-on-rails primary-key


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多