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

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

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

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

Ruby

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

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

検索

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

Q&A

1回答

1299閲覧

複数選択するチェックボックスで全て当てはまるものを検索結果に表示したい

su_da221

総合スコア59

Ruby on Rails 5

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

Ruby

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

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

検索

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

0グッド

0クリップ

投稿2020/09/16 10:14

編集2022/01/12 10:55

タグ検索で複数選択できるようにしています。
全てに当てはまる教室を表示したいのですが、できません。

ransack使用

schools_controller.rb params.require(:q).permit(:tags_id_eq_all)

教室やカテゴリのparamsは省略しています。

フォーム.html.erb <%= search_form_for @q do |f| %> <%= f.label :name_cont, '教室' %> <%= f.search_field :name_cont %> <%= f.label :category_id %> <%= f.collection_select :category_id_eq, Category.all, :id, :name, :include_blank => '指定なし' %> <%= f.label :tags_id_eq_all, "タグ" %> <%= f.collection_check_boxes :tags_id_eq_all, @tags, :id, :name %> <%= f.submit "検索" %> <% end %>

urlに表示されるのは
schools?utf8=✓&q%5Bname_cont%5D=&q%5Bcategory_id_eq%5D=&q%5Btags_id_eq_all%5D%5B%5D=&q%5Btags_id_eq_all%5D%5B%5D=1&q%5Btags_id_eq_all%5D%5B%5D=3&commit=検索

となっており該当する教室も表示できていません。
こちら絞り込む方法はありませんか?

追記
上記で検索時のパラメーターはこちらです

{"utf8"=>"✓", "q"=>{"name_cont"=>"", "category_id_eq"=>"", "tags_id_eq_all"=>["", "1", "3"]}, "commit"=>"検索"}

sql

1SELECT "schools".* FROM "schools" LEFT OUTER JOIN "school_tags" ON "school_tags"."school_id" = "schools"."id" LEFT OUTER JOIN "tags" ON "tags"."id" = "school_tags"."tag_id" WHERE ("tags"."id" = 1 AND "tags"."id" = 3)

こちらでアンド検索はできているようでした。
ということは受け取る側の問題でしょうか。

名前とカテゴリー、タグ検索があり、タグのみ検索しています。

該当しているはずの項目はrails consoleで検索すると

School id: 4, category_id: 1, name: "ごり", address: "ワシントン", created_at: "2020-09-15 10:38:23", updated_at: "2020-09-15 10:38:23", hpaddress: "nvkd", tel: "090-9182-9128", time: "12時から18時">

となっていました。
カラムにtag_idがないから検索に引っかからないのでしょうか。
ですが、チェックボックスが3つあり1つしか選択していない時は表示できているので関係ないのかと思いましたが。

rails consoleで「School.find(4).tags」と打った結果

School Load (5.0ms) SELECT "schools".* FROM "schools" WHERE "schools"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]] Tag Load (3.1ms) SELECT "tags".* FROM "tags" INNER JOIN "school_tags" ON "tags"."id" = "school_tags"."tag_id" WHERE "school_tags"."school_id" = ? LIMIT ? [["school_id", 4], ["LIMIT", 11]] => #<ActiveRecord::Associations::CollectionProxy [#<Tag id: 1, name: "成犬OK", created_at: "2020-09-10 11:21:01", updated_at: "2020-09-10 11:21:01">, #<Tag id: 3, name: "予約必須", created_at: "2020-09-10 11:21:12", updated_at: "2020-09-10 11:21:12">]>

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

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

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

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

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

guest

回答1

0

all ですか? or の間違いでは?
allですと「全てに該当する」ですから。

追記
もしかしたらSQLの達人が回答くれるかもと待ってましたが無いようなので、、、

私の力ですと一回で選び出す方法は思いつきません。
まず _or で 片方しかないものも含んだ schools を得、
そのあとで
tag_ids = params[:q]からidのlistを得る schools.select{|school| (school.tags.map(&:id) & tag_ids)==tag_ids} で選ぶ
ただしこの方法ですと、ページングを行うのが厄介になります

及び、
schoolの結果が Array になりリレーションではなくなるので、この後リレーションとしての使い方はできません

投稿2020/09/16 22:55

編集2020/09/20 21:30
winterboum

総合スコア23284

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

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

su_da221

2020/09/18 11:15

allは選択したもの全てに該当するではないのでしょうか? どちらも該当するものを検索結果に表示したいです。
winterboum

2020/09/18 11:55

あ、そうです。全てに当てはまるものでひとつでも該当しないとhitしません。 それが目的? で、hitしないとしたらそういうデータが無いからです。 指定した条件、それでhitするはずのデータ、logにあるSQL文を質問を編集して載せていただけますか
su_da221

2020/09/19 06:07

載せました。こちらであっていますでしょうか?
winterboum

2020/09/19 09:26

School.find(4).tags  の結果を
su_da221

2020/09/19 09:38

載せました。tagsは1と3を持っているようでした。
winterboum

2020/09/19 12:46

そうか、、、 このSQLだと IDが1と3をもつTag を検索しているから、そういうTAGはありえないですね。 う〜〜む。。。。
su_da221

2020/09/19 13:01

1と3を持つタグってどういうことでしょうか? タグの登録の時点から間違っているんでしょうか。 今の時点だとtags_id 1 AND tags_id 3は該当する項目がないという状況ですかね 詳細もコメントお願いします
su_da221

2020/09/19 13:03

School.find(4).tag_idsでコマンドを打つと [1, 3] と表示できたのでtagは2個登録できているということではないですか?
winterboum

2020/09/19 22:53 編集

SQLを見ると WHERE ("tags"."id" = 1 AND "tags"."id" = 3) となっています。 これは 「tags.id が1 で かつ tags.idが3のTAG」といういみです。1のものも3のものもありますが、1でかつ3のものはありえないですよね 「う〜〜む」と書いたのは、期待のものをRansacで記述する以前に生のSQLで書くとしてもどう書いてよいかわからん、、、、という呻きです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問