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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

3回答

11265閲覧

【Rails】ransackを使って、複数選択可のチェックボックスでtrueの値を持つデータの検索を実装したいです。

jusco

総合スコア80

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/07/29 04:12

ransackでの検索で、複数選択可のチェックボックスでの検索を実装したいです。
以下のStatusモデルがあり、UserモデルはStatusモデルと1対1の関連となっています。

Ruby

1 2class User < ActiveRecord::Base` 3 has_one :status 4end 5 6class Status < ActiveRecord::Base 7 FLAG_FIELDS = [:a, :b, :c, :d, :e, :f] 8 belongs_to :user 9end

Statusモデルのカラムは以下のようにboolean型のデータを持ち、:a〜:fまでの状態がtrueかどうかを判定しています。

Ruby

1class CreateStatus < ActiveRecord::Migration 2 def change 3 create_table :status do |t| 4 t.integer :user_id 5 t.boolean :a ,default: true 6 t.boolean :b ,default: false 7 t.boolean :c ,default: false 8 t.boolean :d ,default: false 9 t.boolean :e ,default: false 10 t.boolean :f ,default: false 11 end 12 end 13end

この状態で、Userの検索画面において、User.statusの各カラムがtrueかどうかで、チェックボックスで検索を行いたいです。

Ruby

1検索画面 2<%= search_form_for @q do |f| %> 3 <%= f.label :status_true , "状態" %> 4 <%= f.check_box :status_a_true,{multiple: true},nil %>状態A 5 <%= f.check_box :status_b_true,{multiple: true},nil %>状態B 6 <%= f.check_box :status_c_true,{multiple: true},nil %>状態C 7 <%= f.check_box :status_d_true,{multiple: true},nil %>状態D 8 <%= f.check_box :status_e_true,{multiple: true},nil %>状態E 9 <%= f.check_box :status_f_true,{multiple: true},nil %>状態F 10 11--省略-- 12 13 <%= f.submit %> 14<% end %>

このようなビューで、表示自体はエラー無くできていますが、実際に値が取り出せていないようで、検索が行われません。
チェックした状態全てがtrueを持つUserのみを検索結果に表示したいのですが、どのように実装すればよろしいでしょうか。

ご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ログを見ていると、チェックした時は”1”を、チェックしていない時は”0”をパラメータとして渡していたために、うまく作動していないようでした。

そこで、渡す値をチェックした時に”true"、チェックしていない時に""(無し)をパラメータとして渡すように、ビューを以下のように書き換えることで動作しました。

Ruby

1検索画面 2<%= search_form_for @q do |f| %> 3 <%= f.label :status_true , "状態" %> 4 <%= f.check_box :status_a_eq , {},checked_value = "true", unchecked_value = "" %>状態A 5 <%= f.check_box :status_b_eq , {},checked_value = "true", unchecked_value = "" %>状態B 6 <%= f.check_box :status_c_eq , {},checked_value = "true", unchecked_value = "" %>状態C 7 <%= f.check_box :status_d_eq , {},checked_value = "true", unchecked_value = "" %>状態D 8 <%= f.check_box :status_e_eq , {},checked_value = "true", unchecked_value = "" %>状態E 9 <%= f.check_box :status_f_eq , {},checked_value = "true", unchecked_value = "" %>状態F 10 11--省略-- 12 13 <%= f.submit %> 14<% end %>

ご回答していただいた方、ありがとうございました!

投稿2015/07/29 05:48

jusco

総合スコア80

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

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

0

ベストアンサー

runsackでしたね。
先ほどの投稿は無視してください。

ビューをいじらない前提だと

Ruby

1conditions = {} 2if params[:q][:status_a_true] 3 conditions[:status_a_cont] = true 4end 5if params[:q][:status_b_true] 6 conditions[:status_b_cont] = true 7end 8if params[:q][:status_c_true] 9 conditions[:status_c_cont] = true 10end 11if params[:q][:status_d_true] 12 conditions[:status_d_cont] = true 13end 14if params[:q][:status_e_true] 15 conditions[:status_f_cont] = true 16end 17 18@users = User.search(conditions).result

ビューをいじってみる

HTML

1<%= search_form_for @q do |f| %> 2 <%= f.label :status_true , "状態" %> 3 <%= f.check_box :status_a_cont,{multiple: true},nil %>状態A 4 <%= f.check_box :status_b_cont,{multiple: true},nil %>状態B 5 <%= f.check_box :status_c_cont,{multiple: true},nil %>状態C 6 <%= f.check_box :status_d_cont,{multiple: true},nil %>状態D 7 <%= f.check_box :status_e_cont,{multiple: true},nil %>状態E 8 <%= f.check_box :status_f_cont,{multiple: true},nil %>状態F 9 <%= submit_tag "search" %> 10<% end %>

Ruby

1@users = User.search(params[:q]).result

ってかんじ

投稿2015/07/29 05:37

rifuch

総合スコア1901

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

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

jusco

2015/07/29 05:44

ご回答ありがとうございました! 実装してみます。 ちょうど今、ビューを下記のように書き換えたことでうまく動作しました。 <%= f.check_box :status_a_eq , {},checked_value = "true", unchecked_value = ""l %>状態A 回答いただいた方法も試してみたいと思います。ありがとうございましたm(__)m
guest

0

なんか泥臭いコードですが、単純に。

Ruby

1user_table = User.arel_table 2status_table = Status.arel_table 3conditions = nil 4if params[:status_a_true] 5 conditions = status_table[:a].eq(true) 6end 7if params[:status_b_true] 8 if conditions 9 conditions = conditions.and(status_table[:b].eq(true)) 10 else 11 conditions = status_table[:b].eq(true) 12 end 13end 14if params[:status_c_true] 15 if conditions 16 conditions = conditions.and(status_table[:c].eq(true)) 17 else 18 conditions = status_table[:c].eq(true) 19 end 20end 21if params[:status_d_true] 22 if conditions 23 conditions = conditions.and(status_table[:d].eq(true)) 24 else 25 conditions = status_table[:d].eq(true) 26 end 27end 28if params[:status_e_true] 29 if conditions 30 conditions = conditions.and(status_table[:e].eq(true)) 31 else 32 conditions = status_table[:e].eq(true) 33 end 34end 35if params[:status_f_true] 36 if conditions 37 conditions = conditions.and(status_table[:f].eq(true)) 38 else 39 conditions = status_table[:f].eq(true) 40 end 41end 42 43@users = User.includes(status_table).on(user_table[:id].eq(status_table[:user_id]).where(conditions).all

もうちょっと洗練されたやり方があるとおもいます。
モデル側でなんなんするとか。

投稿2015/07/29 05:24

rifuch

総合スコア1901

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問