Rails アソシエーションの設定方法とメリット

May 15th, 2021

1:多の関係イメージ図

  • 一人のuserが0以上のbookと紐づいており、
  • 1冊のbookは必ず誰かuser一人と紐づいている。

イメージ図


アソシエーションの設定は大きく捉えて2つだけ

  1. モデルに関係性を定義
  2. Userモデルに has_many :books の設定を定義する
  3. Bookモデルに belongs_to :user の設定を定義する
  4. idレベルで紐付け

    「Nが」相手のid相手のモデル名_idに 保持している *主キー(id)と外部キー(user_id)の紐付け


設定方法は分かったけど...アソシエーションで嬉しいこととは?

その1: userのインスタンス.books

紐づいたbookを全て取得できる

その2: bookのインスタンス.user

紐づいたuserを一人取得できる

互いに紐づくモノを取得できるということですね。


実際に検証してみました!😲

前提

このようなデータベースのテーブルがあるとします

usersテーブル |id|name|introduction| |---|---|---| |1|メンター太郎|Rubyが得意です| |2|メンター二郎|HTML/CSSが得意です| |3|ねずこ|鬼滅の主人公の妹です。。。|

booksテーブル |id|title|body|user_id| |---|---|---|---| |1|Ruby on Railsデザインパターン|仕組みがよく分かった!|1| |2|HTML/CSSデザインパターン|デザインパターンが増えた!|2| |3|鬼滅の刃|面白かった!|3| |4|星の王子様|大切なものとは何か考えさせられた。。。|1|

rails cではこのように取得できます

> rails c

> User.all # データベースから全てのUserを取得

[#<user id: 1, name: 'メンター太郎', introduction: 'Rubyが得意です', ... >
#<user id: 2, name: 'メンター二郎', introduction: 'HTML/CSSが得意です', ... >
#<user id: 3, name: 'ねずこ', introduction: '鬼滅の主人公の妹です。。。', ... >]
> rails c

> Book.all # データベースから全てのBookを取得

[#<book id: 1, title: 'Ruby on Railsデザインパターン', body: '仕組みがよく分かった!', user_id: 1, ... >,
#<book id: 2, title: 'HTML/CSSデザインパターン', body: 'デザインパターンが増えた!', user_id: 2, ... >,
#<book id: 3, title: '鬼滅の刃', body: '面白かった!', user_id: 3, ... >,
#<book id: 4, title: '星の王子様', body: '大切なものとは何か考えさせられた。。。', user_id: 1, ... >]

実際に実験してみる

rails console で実験してみると...

❯ rails c

Running via Spring preloader in process 16083
Loading development environment (Rails 5.2.4.3)

[1] pry(main)> user_instance = User.find(1)
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: 'メンター太郎', introduction: 'Rubyが得意です', ... >

[2] pry(main)> user_instance.books
  Book Load (0.7ms)  SELECT "books".* FROM "books" WHERE "books"."user_id" = ?  [["user_id", 1]]
=> [#<Book id: 1, title: 'Ruby on Railsデザインパターン', body: '仕組みがよく分かった!', user_id: 1, ... >,
  #<Book id: 4, title: '星の王子様': '大切なものとは何か考えさせられた。。。', user_id: 1, ...> ]

idが1のuserからuser_idが1のbookを2つ割り出せました。


userからbookを取得でき、bookからuserを取得できる

これを簡単にできるのがアソシエーションの大きなメリットではないでしょうか?😃


参考