【问题标题】:generate a model with a string field as primary key生成带有字符串字段作为主键的模型
【发布时间】:2016-01-01 19:37:21
【问题描述】:

我想在我的 Ruby on Rails 应用程序中创建一个 User 模型。

我使用以下命令:

rails generate model User email:string name:string role:string

是否可以使用此命令将email 定义为主键?或者我必须修改使用此命令创建的数据库迁移文件?怎么做?

【问题讨论】:

    标签: ruby-on-rails model rails-activerecord primary-key


    【解决方案1】:

    不,你不能。默认情况下,主键是一个自增整数。

    但是,您可以打开从该命令生成的迁移并更改它(在运行 rake db:migrate 命令之前)。迁移可能会有create_table 命令:

    class CreateUsers < ActiveRecord::Migration
      def change
        create_table :users do |t|
          # ...
        end
      end
    end
    

    如果您阅读create_table 文档,您会注意到您可以传递两个选项。具体来说,您需要将:id设置为false,以不生成id字段,并且您需要指定主键字段的名称。

        create_table :users, id: false, primary_key: :email do |t|
    

    【讨论】:

    • 好的,非常感谢您的回复。那我改一下迁移文件。
    【解决方案2】:

    要添加到@Simone Carletti 的答案,您可能需要使用execute 来设置primary key(如果它不明确)。如果您正在修改现有表,这将尤其如此,而您显然没有这样做:

    class CreateUsers < ActiveRecord::Migration
       def change
          create_table :users, id: false do |t|
             t.string :email, null: false
             t.timestamps
          end
          execute "ALTER TABLE users ADD PRIMARY KEY (email);"
       end
    end
    

    我们在一些应用程序中使用uuid,这就是我们必须做的(primary_key: :uuid 不起作用)...


    【讨论】:

      【解决方案3】:

      在 Migration 6.0 或 Rails 6 中

      class CreateUsers < ActiveRecord::Migration[6.0]
         def change
             create_table :users, id: false do |t|
                 t.string :email, null: false, primary_key: true
                 t.timestamps
             end
         end
      end
      

      【讨论】:

        【解决方案4】:

        在最新版本的 ActiveRecord 中,您可以使用--primary-key-type 在生成命令中指定主键类型:

        rails generate model User email:string --primary-key-type=string
        

        产生迁移:

        class CreateUsers < ActiveRecord::Migration[6.0]
          def change
            create_table :users, id: :string do |t|
              t.string :email
        
              t.timestamps
            end
          end
        end
        

        但是,据我所知,除了手动之外,仍然无法更改主键列的名称。

        【讨论】:

          猜你喜欢
          • 2013-12-21
          • 1970-01-01
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 1970-01-01
          • 2019-01-30
          • 2019-10-04
          • 2010-10-06
          相关资源
          最近更新 更多