0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

中間テーブルを使ってタグ検索機能を実装したい。

Posted at

ゴール

アーカイブページには全てのアーカイブを一覧で表示していますが、タグを使って絞り込み検索ができるようにしたいと思います。

model作成、DB設計

tagを管理するtagモデルとアーカイブと紐付けるための中間テーブルでtag_relationモデルを作成しました。
既に作っているarchivesテーブルと新しくタグを管理する 、tagsテーブル、それから中間テーブルとしてtag_relationsテーブルを作成しました。

db/migrate/************_create_tag_relations.rb
class CreateTagRelations < ActiveRecord::Migration[6.0]
  def change
    create_table :tag_relations do |t|
      t.references :tag, foreign_key: true
      t.references :archive, foreign_key: true
      t.timestamps
    end
  end
end
db/migrate/2************_create_tags.rb
class CreateTags < ActiveRecord::Migration[6.0]
  def change
    create_table :tags do |t|
      t.string :name
      t.timestamps
    end
  end
end

アソシエーション

app/models/archive.rb
class Archive < ApplicationRecord
  has_many :tag_relations, dependent: :destroy
  has_many :tags, through: :tag_relations
end
app/models/tag_relation.rb
class TagRelation < ApplicationRecord
  belongs_to :archive
  belongs_to :tag
end
app/models/tag.rb
class Tag < ApplicationRecord
  has_many :tag_relations, dependent: :destroy
  has_many :archives, through: :tag_relations
end

tagとarchiveにそれぞれアソシエーションをするのですが、その際にtag_relationを通ってアソシエーションするように設定します。

controllerの設定

今回は特にrootingで追加の設定をすることなく、indexにそのままタグ検索も入れ込みます。

app/controllers/archive_controller.rb
class ArchiveController < ApplicationController
  def index
    @archive = params[:tag_id].present? ? Tag.find(params[:tag_id]).archives.page(params[:page]).per(15) : Archive.all.page(params[:page]).per(15)
  end
end

ちょっと長いですが、

params[:tag_id].present?

ここで選択されたtag_idが存在している場合は、tagsテーブルからtag_idに一致するarchivesを探してくれます。
存在しない場合はArchive .allで全ての情報を取得します。

次に向けて

今はドリルダウンでの選択ですが、これをよくある選択式にしたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?