Just do IT

思うは招く

【Rails】テーブルを新規作成するときに外部キーも設定する

たとえば、親モデル(User)があり、user_id を外部キーとして子モデル(Book)を作りたい場合。

bin/rails g model Book title:string memo:text user:references

user:referencesをつけると、booksテーブルにはuser_idが自動で追加される。users テーブルと紐付けることができる。userは単数形という点に注意。

referencesを使うと、子モデル(この場合Book)のbook.rbには自動的にアソシエーションを作成してくれる。

book.rb

class Book < ApplicationRecord
  belongs_to :user
end

ただし、親モデル側(User)にはhas_manyは作成されない。自分で追記する必要がある。

user.rb

class User < ApplicationRecord
  has_many :books #追記
end

schema.rb はこうなる。

ActiveRecord::Schema.define(version: 2020_06_13_060739) do

  create_table "books", force: :cascade do |t|
    t.string "title"
    t.text "memo"
    t.integer "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_books_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  add_foreign_key "books", "users"
end

t.index ["user_id"]と、自動でインデックスも貼られている。

rails cで確かめてみる。

> user = User.create name: "James"
> user.books.create title: "I am the KING"
> user.books
 [#<Book id: 3, title: "I am the KING", memo: nil, user_id: 4, created_at: "2020-06-13 06:12:36", updated_at: "2020-06-13 06:12:36">]

User と Book がちゃんと紐付いているのがわかる。