モデルの関連付け!ruby on railsで書くassociationの使い方【初心者向け】

Railsでassociationを使う方法を解説しています。Webアプリを開発する中では当然のように必要になってくるものなので使えるようにしておきましょう。実際にソースコードを見ながら理解していきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が1,000以上あります。

RubyのフレームワークのRuby on Rails にはassociationという機能があります。これは、モデルとモデルを関連付けるためのもので、これを行うことによってコード内の操作がわかりやすくなります。

 

なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。

 

20160620

 

田島メンター!!associationというのは何ですか〜?

 

20163020-2

 

associationはモデル同士を関連付けることを言うんだ。モデルとモデルに強い関連性があって、何かの処理を同時に行う必要がある場合などに役立つよ。

 

20160620

 

片方を消したらもう片方も消さないといけない、とかですか?

 

20163020-2

 

そんな感じだね。実際にどのようにモデル同士を関連付けるか見てみよう。

 

associationの書き方

今回はブログシステムを例に考えてみます。以下のように、ブログは一人のユーザー(User)に対して、たくさんの投稿(Post)が関連づけられています。

TechAcademyのブログ
|---初めてのRails
|---初めてのassotiation

これをコードで表すと以下のようになります。

class User
has_many :posts
end
class Post
belong_to :user
end

Userクラス内でpostsと複数形になっているのに注意してください。

このように、一つのユーザーに対して、多数の投稿を関連付けることができました。

 

20163020-2

 

“has_many”と”belogns_to”を使った1対多の関連付けだよ。英語で考えると分かりやすいね。

 

20160620

 

この場合だと、親要素のUserがたくさんのPostという子要素を持っている形になりますね。

 

20163020-2

 

こうすることによってUserを削除したとき、関連したPostのデータも同時に削除されるようになるんだ。

 

データの取得方法

TechAcademyのブログ
|---初めてのRails
|---初めてのassociation

先ほどと同じように、ブログのユーザーとポストで考えてみたいと思います。

user.posts.size            #=>2
user.posts[0].text     #=>初めてのRails
user.posts[1].text     #=>初めてのassociation
Parent.Children.要素名

で取得することができます。

 

[PR] プログラミングで挫折しない学習方法を動画で公開中

データの保存方法

次にデータの保存方法について説明します。

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について解説しました。

モデルを扱う上で大事な知識になりますので、是非理解を深めておきましょう。

 

20163020-2

 

関連付けられたものについて、データを取得したり保存する方法を解説したよ。

 

20160620

 

1対多の関係性は色々なものに適用できそうですね。

 

20163020-2

 

has_manyで関連付けを行った場合、対象のモデル名は複数形にすることを忘れないようにしよう。

 

20160620

 

分かりました。ありがとうございました!

 

 

[お知らせ]TechAcademyでは初心者でも8週間でエンジニアになれるRuby on Railsオンラインブートキャンプを開催しています。RubyでWebアプリを開発したい方はご参加ください。