たとえば、親モデル(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 がちゃんと紐付いているのがわかる。