【解決したい課題】
tag_nameで検索できるように検索を実装したい
【現状】(エラー内容)
検索機能実装中です。
Article,ArticleTag,Tagの3つのモデルがあり、ArticleTagが中間テーブルとなっています
検索機能はArticleモデルで設定しており、Tagモデルのカラムであるtag_nameを検索結果で表示できず困っておりました。
Articleテーブルのカラムは問題なく検索できている状態です。
【該当ソースコード】
schema.rb
create_table "article_tags", force: :cascade do |t| t.integer "article_id" t.integer "tag_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["article_id"], name: "index_article_tags_on_article_id" t.index ["tag_id"], name: "index_article_tags_on_tag_id" end create_table "articles", force: :cascade do |t| t.string "title" t.text "body" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "user_id" t.string "sub_title" end create_table "tags", force: :cascade do |t| t.string "tag_name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end
Articleモデル
class Article < ApplicationRecord belongs_to :user has_many :article_tags has_many :tags, through: :article_tags, dependent: :destroy #複数のタグ付け機能で実装 def tags_save(tag_list) if self.tags != nil article_tags_records = ArticleTag.where(article_id:self.id) article_tags_records.destroy_all end tag_list.each do |tag| inspected_tag = Tag.where(tag_name:tag).first_or_create self.tags << inspected_tag end end #複数検索できるように設定 def self.search(search_word) Article.where(["title LIKE(?) OR body LIKE(?) OR sub_title LIKE(?)", "%#{search_word}%", "%#{search_word}%", "%#{search_word}%"]) Tag.where(["tag_name LIKE(?)", "%#{search_word}%"]) end validates :title, presence: true, length: { minimum: 1 } validates :body, presence: true end
Tagモデル
class Tag < ApplicationRecord has_many :tags, through: :article_tags has_many :article_tags end
_index.html.erb → search.html.erbで部分テンプレ化しています
<div class="card"> <div class="card-body"> <h4 class="card-title"> <%= link_to article.title, article %> </h4> <h6 class="card-subtitle mb-2 text-muted"> <% article.tags.each do |tag| %> <%= link_to tag.tag_name %> <% end %> </h6> <h6 class="card-subtitle mb-2 text-muted"> <%= article.sub_title %> </h6> <p class="card-text"> <%= markdown(article.body).html_safe %> </p> </div> </div>
home_controller.rb
def search @article = Article.new @articles = Article.search(params[:keyword]) .page(params[:page]).per(10) @bookmarks = Article.find(Bookmark.group(:article_id) .order(Arel.sql("count(article_id) desc")) .pluck(:article_id)) @reviews = Article.find(Comment.group(:article_id) .order(Arel.sql("avg(rate) desc")) .pluck(:article_id)) end
search.html.erb
<div class="container"> <p id="notice"><%= notice %></p> <h1>みんなのノウハウ</h1> <% if @articles.exists? %> <div class="tab-area"> <div class="tab active"> 新着投稿 </div> <div class="tab"> ブックマーク数順 </div> <div class="tab"> 評価の高い順 </div> </div> <div class="content-area"> <!--新規投稿順--> <div class="content show"> <% @articles.each do |article| %> <%= render "public/articles/index", article: article %> <% end %> <div class = "pagination-sm"> <%= paginate @articles %> </div> </div> <!--ブックマーク数順--> <div class="content"> <% @bookmarks.each.with_index(1) do |article, i| %> <%= render "public/articles/index", article: article %> <% end %> </div> <!--評価の高い順--> <div class="content"> <% @reviews.each.with_index(1) do |article, i| %> <%= render "public/articles/index", article: article %> <% end %> </div> </div> <% else %> <p>該当する記事は見つかりませんでした。</p> <% end %> <%= link_to "HOME", home_path %> </div>
エラー詳細です
ActiveRecord::StatementInvalid in Public::Homes#search Showing /home/ec2-user/environment/Teach_Market/app/views/public/homes/search.html.erb where line #6 raised: SQLite3::SQLException: no such column: tag_name: SELECT 1 AS one FROM "articles" WHERE (title LIKE('%営業%') OR body LIKE('%営業%') OR tag_name LIKE('%営業%') ) LIMIT ? OFFSET ?
<%= form_with url: search_path, method: :get, local: true do |f| %> <%= f.text_field :keyword,placeholder: "キーワードで検索", class: "search-text" <%= button_tag type: "submit", class: "btn btn-default" do %> <i class="fas fa-search"></i> <% end %> <% end %>
【対策と自分の考え】
Articleモデルへtag_nameの検索を追加 → StatementInvalid で怒られる
Tagモデルへ検索メソッドを追記 → 変化なし
上記試しましたが解消しませんでした。
ご確認をよろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー