0
Help us understand the problem. What are the problem?

posted at

updated at

タグ付け機能

タグ付け機能の実装

概要

  • ポートフォリオ作成として、学習マッチングサイトを作成。サイト内で講座を作る際にタグ付けを実装したい。
  • ユーザーが自由にタグ付けできるようにしたい。

環境

  • Rails 5.2.6
  • ruby 2.6.3

アソシエーション

6ab4f133dfb54bd244def97a350b6d3e.png
講座(Lessonsテーブル)は複数のタグを持ち、タグ(Tagsテーブル)は複数の講座を持つため、講座:タグ=多:多となるため、中間テーブルとして、TagListsテーブルを作成した。

テーブル定義

Image from Gyazo
Image from Gyazo

モデル

Image from Gyazo
Image from Gyazo
Image from Gyazo

コントローラ

Lessonsコントローラ

  • createメソッド
    Image from Gyazo
  • updateメソッド
    Image from Gyazo
    createメソッドもupdateメソッドも、フォームにタグの名前を入力して、@lesson(インスタンス変数)に格納し、送信後に各メソッド内でparamsとして展開して、名前を配列としてtag_listに格納し、@lessonに対して、tag_listを引数にsave_tagメソッドを呼び出している。

save_tagメソッド

save_tagメソッドは、Lessonモデルに定義されている。
Image from Gyazo

  • 既に@lessonに関連付けされているタグを取得し、nameカラムを配列に格納する。pluckは引数にカラムの値を指定して、その配列を返すメソッドである。
    Image from Gyazo
  • 既に@lessonに関連づけられていたが、新たに作成したタグには存在しないタグをold_tagsに格納する。
  • 新たに作成したタグの内、既に@lessonに関連づけられていたタグ以外のタグをnew_tagsに格納する。
    Image from Gyazo
  • ①old_tagsを元に、該当するtagと、tagと@lessonとを関連づけるtag_listを定義する。
    Image from Gyazo
  • ②該当するtagが関連づけられたlessonが複数存在する場合には、tagのデータを削除すると、他の関連づけられたlessonで障害が生じるため、上記で定義したold_tag_listのみ削除する。関連づけられたlessonが1つしか存在しない場合は、どちらも削除する。
    Image from Gyazo
  • ③find_or_create_byは条件を指定して初めの1件を取得し1件もなければ作成するメソッドである。Tagモデルに対して、find_or_create_byメソッドを呼び出して、new_tagに格納する。その後、self.tags(@lessonに関連づけされたtagの配列)にnew_tagを追加する。<<は配列に対して行うインスタンスメソッドであり、「Array << 要素」のように要素を追加するメソッドである。
    Image from Gyazo

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?