モデルの関連付け!ruby on railsで書くassociationの使い方【初心者向け】
Railsでassociationを使う方法を解説しています。Webアプリを開発する中では当然のように必要になってくるものなので使えるようにしておきましょう。実際にソースコードを見ながら理解していきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
RubyのフレームワークのRuby on Rails にはassociationという機能があります。これは、モデルとモデルを関連付けるためのもので、これを行うことによってコード内の操作がわかりやすくなります。
なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。
田島メンター!!associationというのは何ですか〜?
associationはモデル同士を関連付けることを言うんだ。モデルとモデルに強い関連性があって、何かの処理を同時に行う必要がある場合などに役立つよ。
片方を消したらもう片方も消さないといけない、とかですか?
そんな感じだね。実際にどのようにモデル同士を関連付けるか見てみよう。
associationの書き方
今回はブログシステムを例に考えてみます。以下のように、ブログは一人のユーザー(User)に対して、たくさんの投稿(Post)が関連づけられています。
TechAcademyのブログ |---初めてのRails |---初めてのassotiation
これをコードで表すと以下のようになります。
class User has_many :posts end class Post belong_to :user end
Userクラス内でpostsと複数形になっているのに注意してください。
このように、一つのユーザーに対して、多数の投稿を関連付けることができました。
“has_many”と”belogns_to”を使った1対多の関連付けだよ。英語で考えると分かりやすいね。
この場合だと、親要素のUserがたくさんのPostという子要素を持っている形になりますね。
こうすることによってUserを削除したとき、関連したPostのデータも同時に削除されるようになるんだ。
データの取得方法
TechAcademyのブログ |---初めてのRails |---初めてのassociation
先ほどと同じように、ブログのユーザーとポストで考えてみたいと思います。
user.posts.size #=>2 user.posts[0].text #=>初めてのRails user.posts[1].text #=>初めてのassociation Parent.Children.要素名
で取得することができます。
データの保存方法
次にデータの保存方法について説明します。
user = User.create(name: "TechAcademyのブログ") post = user.posts.create(text: "初めてのRails") user.name #=>TechAcademyのブログ user.posts[0].text #=> 初めてのRails
また、以下のようにcreateの代わりにbuildを使うとデータベースに保存されずに使用することができます。
user = User.create(name: "TechAcademyのブログ") post = user.posts.build(text: "初めてのRails") user.name #=>TechAcademyのブログ user.posts[0].text #=> 初めてのRails post.persisted? #=> false
合わせてマイグレーションの実行を行う方法などをまとめた記事もご覧ください。
簡単にassociationについて解説しました。
モデルを扱う上で大事な知識になりますので、是非理解を深めておきましょう。
関連付けられたものについて、データを取得したり保存する方法を解説したよ。
1対多の関係性は色々なものに適用できそうですね。
has_manyで関連付けを行った場合、対象のモデル名は複数形にすることを忘れないようにしよう。
分かりました。ありがとうございました!
[お知らせ]TechAcademyでは初心者でも8週間でエンジニアになれるRuby on Railsオンラインブートキャンプを開催しています。RubyでWebアプリを開発したい方はご参加ください。