2つめのモデルを追加する

2つめのモデルを追加する

blogで自分が投稿した記事に対して、読者がコメントをつける機能を実装してみましょう。 その為には現在のArticleモデルの他にもう1つモデルを追加する必要があります。

吉田先生

2つめのモデルをセカンドモデルと呼びます。 1つのblog記事に複数のコメントがついているような状態を1対多の関係と呼びます。

2つめのモデルを追加する

1.2つのモデルを関連付ける

では実際に2つめのモデルを作成していきましょう。

今回は記事に対してコメントをつける為のモデルなので、Commentモデルを作成します。

モデルを作成するコマンドは教程1のコチラで解説したように$ rails g model名でしたね。

またモデルにどのようなデータが入るのかも後ろに続けることができます。

Articleモデルを作成した時は、

<strong>$ rails g model Article title:string text:text</strong>

というコマンドで、「stringという特徴をもったtitleという機能と、textという特徴をもったtextという機能のあるArticleという名前のモデルを作りなさい」という指示でした。

今から作成するコメントモデルにはstringという特徴を持ったcommenterという機能と、コメントを入力する為のtextという特徴をもったbodyという機能を追加します。

そこで

<strong> $ rails g model Comment commenter:string body:text</strong>

となります。

しかし、これでは新しくCommentモデルを作成することはできますが、ArticleモデルとCommentモデルはまだ独立したままです。

そこで、このArticleモデルとCommentモデルを関連づける必要があります。

こういった場合は、

<strong>$ rails g model Comment body:text article:references</strong>

となります。

最後のarticle:references ですが、referencesとは関連づけをする為のコマンドです。

article:referencesでarticleを参照しなさいという指示をCommentモデルに追加することができます。

これでArticleモデルの他に、Commentモデルというセカンドモデル(2つ目のモデル)を作ることができました。

しかし今のままではこの2つのモデルの関連づけはできていません。

そこで各モデルの関係性を明記してRailsにArticleモデルとCommentモデルは関連があるよ、と教えてあげなければいけません。

ArticleモデルとCommentモデルのファイルを開いてください。

Commentモデルファイルには既にbelongs_to articleと記述されています。

これはCommentモデルを作成する際に article:references とCommentモデルはarticleを参照しなさいというコマンドを追加していた為、RailsがCommentモデル作成時に自動で記述をしてくれいたからです。

しかし、このままではCommentモデルがArticleモデルに紐づいていることはわかりますが、ArticleモデルがCommentとどのような関係かがわかりません。

そこでArticleモデルに has_many :commtens と追記して保存します。

これでArticleモデルとCommentモデルの関連付けができました。

2..routesの作成

Commentモデルは完成しましたが、まだコメントをつけることができるようにはなっていません。

教程4でblogアプリを作成した際にRoutesファイルに resources :aritcleと追記することで、blogアプリはarticle(記事)を下に作成しますと宣言することになります と解説しました。

実はresources :aritcleと記述することで、articleを作成(create)したり、表示(show)したり、更新(edit/update)したり、削除(delete)したりする為のパスやURIパターンが作成されていたのです。

今回もCommentのデータに必要な機能を作成する為にresources :commentsの1文を追加します。

recources :article do

resources :comments

end

と入れ子状態で記述することで、Commentデータに関するURIパターンやパスを作成する際に、articleと紐づけたものを作成してくれるようになります。

いちど$ rake routesで確認してみましょう。

Commentに関するURIやパスがarticleと紐づいているのがわかります。

3.コンソールで関連付けを試してみる

$ rake routesで確認する限りは、2つのモデルの関連付けはうまくいっているようです。

一度コンソールを使って、データがどのようになっているのかを見てみましょう。

article = Article.first

というコマンドで、articleという箱の中にArticleとして保存されたデータの中のfirst、つまり最初のデータを取得します。

article.commentsと入力すると、article = Article.firstで取得したarticleという箱に入ったデータに紐づいたコメントを確認することができます。

もちろん今はまだコメントを投稿していないので、コメント自体のデータは表示されません。

しかし、もし2つのモデルの関連付けがおこなわれていない状態でarticle.commentsコマンドを実行するとコンソールにはエラーが表示されます。

このコンソールの結果からも2つのモデルの関連づけはうまくっていることがわかります。

3.コメントを作成して確認する

コンソールからコメントを作成しましょう。

教程4でコンソールからモデルにデータを保存する方法を解説しました。

教程4では article = Article.new(title: "別の書き方", text: "ありますよ") というコマンドでデータを作成する方法を紹介しました。

今回はこのコマンドを少し応用してコメントを作成します。

<strong>article.comments.create(body: "最初の投稿です")</strong>

これでデータベースにコメントのデータが保存されました。

ではもう一度article.commentsでコメントを見てみましょう。

Article.firstに紐づいたコメントのデータを確認することができました!

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×