How to Create a New Table With a Unique Index in an Active Record / Rails 4 Migration

前端 未结 5 1898
生来不讨喜
生来不讨喜 2021-02-01 12:41

How do I create a new table, through a rails migration, and add an unique index to it?

In the docs I found how to add a index to a table after it\'s been created, but h

相关标签:
5条回答
  • 2021-02-01 13:10

    In Rails 5, you can provide index options along with column definition.

    create_table :table_name do |t|
      t.string :key, null: false, index: {unique: true}
      t.jsonb :value
    
      t.timestamps
    end
    
    
    Column   |            Type             | Collation | Nullable |                 Default
    ------------+-----------------------------+-----------+----------+-----------------------------------------
    id         | bigint                      |           | not null | nextval('table_name_id_seq'::regclass)
    key        | character varying           |           | not null |
    value      | jsonb                       |           |          |
    created_at | timestamp without time zone |           | not null |
    updated_at | timestamp without time zone |           | not null |
    Indexes:
      "table_name_pkey" PRIMARY KEY, btree (id)
      "index_table_name_on_key" UNIQUE, btree (key)
    
    
    0 讨论(0)
  • 2021-02-01 13:11

    A more compact way:

    class CreateFoobars < ActiveRecord::Migration
      def change
        create_table :foobars do |t|
          t.string :name, index: {unique: true}
        end
      end
    end
    
    0 讨论(0)
  • 2021-02-01 13:16

    You can create the table and index with the generator without changing the migration file

    For a unique index

    rails generate model CreateFoos bar:string:uniq
    

    For a non-unique index

    rails generate model CreateFoos bar:string:index
    
    0 讨论(0)
  • 2021-02-01 13:21

    Here's the full process:

    Generate a migration ( rails generate migration CreateFoos bar:string or rails g migration CreateFoos bar:string )

    Modify your migration to look something like this:

    class CreateFoos < ActiveRecord::Migration
      def change
        create_table :foos do |t|
          t.string :bar, :null => false
    
          t.index :bar, unique: true
        end
      end
    end
    

    Run rake db:migrate

    0 讨论(0)
  • 2021-02-01 13:27

    After generating a migration rails generate migration CreateBoards name:string description:string

    In the migration file, add index as shown below:

    class CreateBoards < ActiveRecord::Migration
      def change
       create_table :boards do |t|
         t.string :name
         t.string :description
    
         t.timestamps
       end
    
       add_index :boards, :name, unique: true
    
     end
    end
    
    0 讨论(0)
提交回复
热议问题