ume

レビュー機能の実装(データの関連付け)

前書き

ECサイトAmazonのようなアプリ)を制作途中でこのようなレビュー投稿機能を実装しようとしています。実装過程で自分にとって新しい概念が出てきましたので記録するとともに、記事を見ている方の勉強の参考になればと思い記事に残しています.

実装までの大まかな手順.
①レビュー用のモデルの作成.
②レビューと商品・ユーザーの関連付けを行う.
③レビュー用のコントローラーの作成と編集 #私にとって新しい概念が出てきました.
④ルーティングの作成.
⑤viewファイルの作成と編集.

今回の記事主に③についての紹介ですが一通りざっくりと全体的な流れも紹介させていただきます.

①レビュー用のモデルの作成

rails初学者の方は一度は疑問に思ったことがあると思うのですが「なぜ複数個モデルを作成する必要があるの?」と思ったことがあるのではないでしょうか?以下のようなコマンドを使用したことが多いと思います.

rails g model ○○

なぜ1つのアプリケーションを作成する過程で複数のモデルが必要かというと 「データベースのテーブル毎にモデルを作る必要があるからです」.
またモデルの役割は「データベースとのやり取りを行うクラス」です

②レビューと商品・ユーザーの関連付けを行う.

①で作ったモデルは他に作成したモデルとどのような関係性があるのかを明記してあげる. 関連づけをする理由としてはデータベースに情報を登録する時とかにコードを書く量が減るので可読性が上がったりコードが分かりやすくなる.
↓モデル間の関係性を明記 例

class Product < ApplicationRecord
  belongs_to :category
  has_many :reviews
end

③レビュー用のコントローラーの作成と編集.

1つのアプリケーションに複数のコントローラを作成する理由は「機能ごとにコントローラを分けることによってメンテナンス性をあげる」.
例えば1つのファイルにhtml.scc.javascriptのコードが混じっていたら読みにくくて何をしたいのかっていうのが理解しにくくなる。同じように1つのコントローラーで複数の機能を実装しようとすると後から見直した時に何がしたいのか分かりにくくなる.
新しい概念.
関連づけをしたときに複数のテーブルから情報を取得する方法.
例えば 2つテーブルがあったとして「冷蔵庫のレビュー」を知りたいとなった場合で

モデルの関連付け「なし」のときのデータの取得方法と モデル間の関連付け「あり」のときのデータの取得方法を比べてどのような違いがあるか見ていきたいと思います.

関連付けなしパターン

@product = Product.find(1) #プロダクトテーブルの(1)に該当する情報を@productに代入する
@reviews = Review.where(product_id: @product.id) #productテーブルの際と同じようにReviewテーブルの中から該当する情報を取得してきて@productに代入する

関連付けありのパターン

 review.rb
class Review < ActiveRecord::Base
  belongs_to :product
end

 product.rb
class Product < ActiveRecord::Base
  has_many :reviews
end
@product = Product.find(1)
@reviews = @product.reviews # 直感的なコードになる

↑このとき @reviews = @product.reviewsのreviewsの書き方には2種類ある. 1つ目.
モデルにreviewsというメソッドを定義する.

def reviews.  
  Review.find(1)
end 

2つ目1行で表す

@reviews = @product.reviews.find(1)

この時reviewsの所は先頭小文字のテーブル名で、語尾にsがつく

まとめ

関連付けによりデータベースからのデータの取得が関連付けなしと少し違う.