【Rails】モデルをgeneratorで作成するときに外部キー(FK)を設定する(references)

users posts table

Postモデルを作成する段階で、user_idを外部キーとして設定したい

$ rails g model post title:string body:text user:references

次のmigrationファイルが作成される

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.string :title
      t.text :body
      t.references :user, null: false, foreign_key: true

      t.timestamps
    end
  end
end

user_idnull:falseとして設定されるので、適所ユニーク制約やNOTNULL制約などを設定してdb:migrateする

$ rails db:migrate

スキーマ(schema.rb)

スキーマを確認すると、bigintuser_idが設定されており、indexが貼られた状態で作成されていることが分かります。

create_table "posts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
  t.string "title", null: false
  t.text "body", null: false
  t.bigint "user_id", null: false
  t.datetime "created_at", precision: 6, null: false
  t.datetime "updated_at", precision: 6, null: false
  t.index ["user_id"], name: "index_posts_on_user_id"
end

create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
  t.string "name", null: false
  t.datetime "created_at", precision: 6, null: false
  t.datetime "updated_at", precision: 6, null: false
end

add_foreign_key "posts", "users"

Written by@Ryutaro
日々学習した技術系のアウトプットをしていきます。学習内容: Ruby, Ruby on Rails, Go, TypeScript, Docker

GitHub