ゴール
アーカイブページには全てのアーカイブを一覧で表示していますが、タグを使って絞り込み検索ができるようにしたいと思います。
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で全ての情報を取得します。
次に向けて
今はドリルダウンでの選択ですが、これをよくある選択式にしたいと思います。