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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

検索

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

Q&A

解決済

2回答

1311閲覧

active hashでカテゴリ検索は可能か?

divclass123

総合スコア35

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

検索

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

0グッド

0クリップ

投稿2020/12/10 15:11

編集2020/12/10 16:06

前提・実現したいこと

今自分はコーヒーの感想を投稿するアプリを作っていて、産地、コク、酸味加工方式など、をactive hashというgemを用いての投稿をしています。

ransack というgemを使って検索機能を実装しています。
カテゴリー検索をしたいのですが、active hashで作ったカテゴリを検索できるのでしょうか?

イメージ説明

region_id,body_id とかにカテゴリーのidを保存してる感じです

該当のソースコード

region.rb

ruby

1class Region < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '--' }, 4 { id: 2, name: 'マルチリージョン' }, 5 { id: 3, name: 'ラテンアメリカ' }, 6 { id: 4, name: 'アフリカ' }, 7 { id: 5, name: 'アジア、太平洋' } 8 ] 9end

drink.rb

ruby

1class Drink < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 belongs_to :user 4 has_one :trade 5 has_many :drink_tag_relations 6 has_many :tags,through: :drink_tag_relations 7 has_one_attached :image 8 belongs_to_active_hash :region 9 belongs_to_active_hash :body 10 belongs_to_active_hash :acidity 11 belongs_to_active_hash :processing 12 with_options presence: true do 13 validates :name 14 validates :explain 15 end 16end 17

こんな感じで、drink.rbとregion.rbのアソシエーションを組んでて、drinksテーブルに
カテゴリーのidを保存してる感じです

drinks_controller

ruby

1class DrinksController < ApplicationController 2 include SessionsHelper 3 before_action :searched_drink_object,only:[:index,:search_drink] 4 before_action :logged_in_user, only: [:index,:destroy] 5 def index 6 @user = current_user 7 @drinks = Drink.all.order("created_at DESC") 8 set_drink_column 9 end 10 11 def show 12 @drink = Drink.find(params[:id]) 13 @user = @drink.user 14 end 15 16 def new 17 @drink = DrinkTag.new 18 end 19 20 def create 21 @drink = DrinkTag.new(drink_params) 22 if @drink.valid? 23 @drink.save 24 redirect_to drinks_path 25 else 26 render 'new' 27 end 28 end 29 30 def destroy 31 Drink.find(params[:id]).destroy 32 redirect_to root_path 33 end 34 35 # GET search 36 def search 37 return nil if params[:keyword] == "" 38 # 何も入れず検索したらエラーが起こるので、 39 # 明示的にnilを返す 40 tag = Tag.where(['tag_name LIKE ?',"%#{params[:keyword]}%"]) 41 # 第二引数が第一引数の?に入っていく,検索した 42 # タグがデータベースにあれば返す 43 render json:{ keyword: tag} 44 # const tagName = XHR.response.keyword 45 # の.keywordが使えてる 46 47 end 48 49 # GET drinks/search_drinks 50 def search_drink 51 @results = @p.result.includes(:body,:acidity) 52 #binding.pry 53 # 作った検索オブジェクト@pに対して.result 54 # とすると検索結果を取得できる 55 # 検索条件に該当した商品が@pに格納されているので、 56 # その格納されている値を表示する役割があります 57 end 58 59 private 60 def drink_params 61 params.require(:drink_tag).permit(:name,:price,:explain,:image,:tag_name,:region_id,:body_id,:acidity_id,:processing_id).merge(user_id: current_user.id) 62 end 63 64 def searched_drink_object 65 @p = Drink.ransack(params[:q]) 66 # キー(:q)を使ってDrinksテーブルから商品情報を探しています 67 # @pという名前の検索オブジェクトを生成 68 end 69 70 def set_drink_column 71 @drink_region = Region.all 72 @drink_body = Body.all 73 @drink_acidity = Acidity.all 74 @drink_processing = Processing.all 75 end 76 77 78end 79

drink/index.html.erb

ruby

1<h1> 2 商品検索 3</h1> 4<%= search_form_for @p,url: drinks_searchdrink_path do |f| %> 5<%# search_form_for @p(検索オブジェクトを渡すことで 6 検索フォームを生成しています)%> 7 <%= f.label :body_id_eq, 'コク'%> 8 <%= f.collection_select :body_id_eq,@drink_body,:id,:name %> 9 <%# 第一引数: 検索したいカラム名 10 2: 配列データを指定(今回はdrinkの配列) 11 いわば検索したいカラムのデータ元 12 3: 表示する際に参照するDBのカラム名 13 4: 実際に表示されるカラム名 14 5 何も選択してない時に表示される内容%> 15 <br> 16 <%= f.label :acidity_id_eq, '酸味:' %> 17 <%= f.collection_select :acidity_id_eq, @drink_acidity, :id, :name %> 18 <br> 19 <%= f.label :region_id_eq, '地域:' %> 20 <%= f.collection_select :region_id_eq, @drink_region, :id, :name %> 21 <br> 22 <%= f.label :prosessing_id_eq, '加工法:' %> 23 <%= f.collection_select :processing_id_eq, @drink_processing, :id, :name %> 24 <%= f.submit '検索'%> 25<% end %>

ただこれだと、投稿する際に、地域は「アフリカ」とカテゴリーで選択して投稿したにも関わらず、検索欄に何を入れても検索結果はありませんと表示されてしまいます。

うまいこと検索できる方法があれば教えて欲しいです、ざっくりな質問で申し訳ありません

イメージ説明

カテゴリ選択したものがしっかり表示はできてます

イメージ説明

こんな感じでカテゴリー検索をしたいです.

ただカテゴリーの設定はactive hashを用いていて、前述した通り、DBではなくモデルに値を書いてます

ruby

1class Region < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '--' }, 4 { id: 2, name: 'マルチリージョン' }, 5 { id: 3, name: 'ラテンアメリカ' }, 6 { id: 4, name: 'アフリカ' }, 7 { id: 5, name: 'アジア、太平洋' } 8 ] 9end

酸味をlowに選択した時のパラメーターはこれです

[5] pry(#<DrinksController>)> params => <ActionController::Parameters {"q"=><ActionController::Parameters {"body_id_eq"=>"1", "acidity_id_eq"=>"2", "region_id_eq"=>"1", "processing_id_eq"=>"1"} permitted: false>, "commit"=>"検索", "controller"=>"drinks", "action"=>"search_drink"} permitted: false>

検索オブジェクト@pの結果はこれです

条件に一致する結果@resultsの配列は空でした

pry(#<DrinksController>)> @p => Ransack::Search<class: Drink, base: Grouping <conditions: [Condition <attributes: ["body_id"], predicate: eq, values: ["1"]>, Condition <attributes: ["acidity_id"], predicate: eq, values: ["2"]>, Condition <attributes: ["region_id"], predicate: eq, values: ["1"]>, Condition <attributes: ["processing_id"], predicate: eq, values: ["1"]>], combinator: and>> [2] pry(#<DrinksController>)> @results Drink Load (0.5ms) SELECT `drinks`.* FROM `drinks` WHERE (`drinks`.`body_id` = 1 AND `drinks`.`acidity_id` = 2 AND `drinks`.`region_id` = 1 AND `drinks`.`processing_id` = 1) ↳ app/controllers/drinks_controller.rb:52:in `search_drink' => []

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

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

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

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

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

guest

回答2

0

自己解決

drinks/index.html.erb

erb

1<h1> 2 商品検索 3</h1> 4<%= search_form_for @p,url: drinks_searchdrink_path do |f| %> 5<%# search_form_for @p(検索オブジェクトを渡すことで 6 検索フォームを生成しています)%> 7 <%= f.label :body_id_eq, 'コク'%> 8 <%= f.collection_select :body_id_eq,@drink_body,:id,:name %> 9 <%# 第一引数: 検索したいカラム名 10 2: 配列データを指定(今回はdrinkの配列) 11 いわば検索したいカラムのデータ元 12 3: 表示する際に参照するDBのカラム名 13 4: 実際に表示されるカラム名 14 5 何も選択してない時に表示される内容%> 15 <br> 16 <%= f.label :acidity_id_eq, '酸味:' %> 17 <%= f.collection_select :acidity_id_eq, @drink_acidity, :id, :name %> 18 <br> 19 <%= f.label :region_id_eq, '地域:' %> 20 <%= f.collection_select :region_id_eq, @drink_region, :id, :name %> 21 <br> 22 <%= f.label :prosessing_id_eq, '加工法:' %> 23 <%= f.collection_select :processing_id_eq, @drink_processing, :id, :name %> 24 <%= f.submit '検索'%> 25<% end %>

erb

1 2<h1> 3 商品検索 4</h1> 5<%= search_form_for @p, url: drinks_searchdrink_path do |f| %> 6 <%= f.label '地域' %> 7 <%= f.collection_select :region_id_eq, Region.all ,:id, :name, include_blank: '指定なし' %> 8 <%# ベースはドリンククラスで、第二引数で%> 9 <br> 10 <%= f.label 'コク'%> 11 <%= f.collection_select :body_id_eq,Body.all,:id,:name,include_blank: '指定なし' %> 12 <br> 13 <%= f.label '酸味'%> 14 <%= f.collection_select :acidity_id_eq,Acidity.all,:id,:name,include_blank: '指定なし' %> 15 <br> 16 <%= f.label '加工法'%> 17 <%= f.collection_select :processing_id_eq,Processing.all,:id,:name,include_blank: '指定なし' %> 18 <%= f.submit '検索' %> 19<% end %>

と記述する

ポイントは第二引数で、それぞれのカテゴリ-のモデルを指定することと、
drinksテーブルの方には格カテゴリーのidがあるので、
region_id_eqにする

投稿2020/12/11 13:03

divclass123

総合スコア35

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

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

0

質問欄の最下部のpryのログを見る感じでは、発行されているクエリ(≠検索条件)は

SQL

1SELECT 2  `drinks`.* 3FROM 4  `drinks` 5WHERE ( 6     `drinks`.`body_id` = 1 AND 7     `drinks`.`acidity_id` = 2 AND 8     `drinks`.`region_id` = 1 AND 9     `drinks`.`processing_id` = 1 10    )

になっているのかなと思います。

この条件が期待するものであるか確認するのが良いかと思いました。
余計なクエリ(≠検索条件)がついていないかとか。。。

以下、推測ですが、、
collection_selectの設定があやしいかと。。。
下記URLのセレクトボックスの部分を参照してもらうと。。
参考URL

投稿2020/12/11 07:03

yowa

総合スコア28

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

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

divclass123

2020/12/11 11:52

結果,できそうな感じなんですかね、、、? いや、この条件を期待してません、、、! もっと練り直します、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問