タグ付け機能の実装
概要
- ポートフォリオ作成として、学習マッチングサイトを作成。サイト内で講座を作る際にタグ付けを実装したい。
- ユーザーが自由にタグ付けできるようにしたい。
環境
- Rails 5.2.6
- ruby 2.6.3
アソシエーション
講座(Lessonsテーブル)は複数のタグを持ち、タグ(Tagsテーブル)は複数の講座を持つため、講座:タグ=多:多となるため、中間テーブルとして、TagListsテーブルを作成した。
テーブル定義
モデル
コントローラ
Lessonsコントローラ
- createメソッド
- updateメソッド
createメソッドもupdateメソッドも、フォームにタグの名前を入力して、@lesson(インスタンス変数)に格納し、送信後に各メソッド内でparamsとして展開して、名前を配列としてtag_listに格納し、@lessonに対して、tag_listを引数にsave_tagメソッドを呼び出している。
save_tagメソッド
save_tagメソッドは、Lessonモデルに定義されている。
- 既に@lessonに関連付けされているタグを取得し、nameカラムを配列に格納する。pluckは引数にカラムの値を指定して、その配列を返すメソッドである。
- 既に@lessonに関連づけられていたが、新たに作成したタグには存在しないタグをold_tagsに格納する。
- 新たに作成したタグの内、既に@lessonに関連づけられていたタグ以外のタグをnew_tagsに格納する。
- ①old_tagsを元に、該当するtagと、tagと@lessonとを関連づけるtag_listを定義する。
- ②該当するtagが関連づけられたlessonが複数存在する場合には、tagのデータを削除すると、他の関連づけられたlessonで障害が生じるため、上記で定義したold_tag_listのみ削除する。関連づけられたlessonが1つしか存在しない場合は、どちらも削除する。
- ③find_or_create_byは条件を指定して初めの1件を取得し1件もなければ作成するメソッドである。Tagモデルに対して、find_or_create_byメソッドを呼び出して、new_tagに格納する。その後、self.tags(@lessonに関連づけされたtagの配列)にnew_tagを追加する。<<は配列に対して行うインスタンスメソッドであり、「Array << 要素」のように要素を追加するメソッドである。
lessonを新規作成の場合は、①、②は空配列に実行されるため、何も変更が生じないが、③は実行される。一方、lessonのタグを編集する際には、①、②、③が実行され、削除及び追加が行われる。
まとめ
このようにして、タグ付け機能を実装しました。whereは配列を返し、find_byはレコードを返す点など、細かなrubyのメソッドの理解が必要な実装でした。とても勉強になりました。
以下は参考にした記事です。
https://qiita.com/kurawo___D/items/e9a2dd0bf46cca706e5c#2posts%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%ABsearch%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B
https://pikawaka.com/rails/pluck
https://pikawaka.com/rails/find_by
https://pikawaka.com/rails/where
https://docs.ruby-lang.org/ja/latest/method/Array/i/=3c=3c.html
https://railsdoc.com/page/find_or_create_by