質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

814閲覧

アソシエーションを組んでいるカラムの検索方法

nao0725

総合スコア5

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/08/12 09:15

編集2021/08/16 04:54

【解決したい課題】
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モデルへ検索メソッドを追記 → 変化なし

上記試しましたが解消しませんでした。
ご確認をよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

J_O

2021/08/13 08:30

view、controller、エラーの詳細がわからないので、これだけではなんとも言えないですが、 Tag モデルに記載のアソシエーションは has_many :tags, through: :article_tagsではなく、 has_many :articles, through: :article_tagsになるかと思います。
nao0725

2021/08/15 01:37 編集

修正させていただきました。 ご確認をよろしくお願い致します。 アソシエーション変更しました!
J_O

2021/08/15 23:53

検索フォームはどうなっていますか?
nao0725

2021/08/16 04:54

一番下に検索フォーム追加させていただきました。ご確認をよろしくお願い致します。
guest

回答1

0

ベストアンサー

テーブルを結合して検索してみてください

def self.search(search_word) Article.left_joins(:tags) .where(["title LIKE(?) OR body LIKE(?) OR sub_title LIKE(?) OR tag_name LIKE(?)",        "%#{search_word}%", "%#{search_word}%", "%#{search_word}%"], "%#{search_word}%"]) end

投稿2021/08/17 23:45

編集2021/08/18 01:21
J_O

総合スコア143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nao0725

2021/08/18 04:10

joinsで解決できました!ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問