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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

6349閲覧

【Rails】複数のカラムからOR条件で、複数チェックボックスで選択した値から検索したい

jusco

総合スコア80

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2015/08/18 09:19

編集2015/08/21 02:23

あるモデルが持つ3つ以上のカラムに対し、OR条件で複数同時検索を行いたいです。

あるモデルが、job1,job2,job3,job4,job5カラムを持っているとし、検索画面ではjob1job5に入りうる値を指定したチェックボックスを設置し、チェックした値がどれか1つでもjob1job5に入っている場合にあるモデルのデータを取り出す、という処理を行いたいです。

カラムが2つの場合は、ransackで簡単に記述が出来たのですが、3つ以上だとうまくいきませんでした。
そのため、複雑なscopeを書くことになると思うのですが、scopeの書き方にまだ慣れておらず、対処法がわかりません。

ruby

1scope :by_job, ->(input){ 2 joins(:applicant_basic).where("job1 = ? or job2 = ? or job3 = ? or job4 = ? or job5 = ?",input,input,input,input,input) 3 }

上記のようなscopeで、とりあえずチェックした値が1つの場合にはその値に応じたデータを取得することに成功しました。
しかし、複数以上チェックを入れた状態で検索をかけると、
「wrong number of arguments (2 for 1)」というエラーが出てしまいます。

どのような記述をすれば、望むような機能を実装できるでしょうか。

知恵をお貸しして頂けないでしょうか。
よろしくお願いいたします。


追記

ruby

1#1つずつの検索 → 成功 2#この状態で複数選択をしても、順番が最後の選択肢のみが1つだけ適用される 3<label><%= f.check_box :by_job, {}, "職業1" ,nil %>職業1</label> 4<label><%= f.check_box :by_job, {}, "職業2" ,nil %>職業2</label> 5<label><%= f.check_box :by_job, {}, "職業3" ,nil %>職業3</label> 6<label><%= f.check_box :by_job , {}, "職業4",nil %>職業4</label> 7 8#複数OR検索 → 失敗 9<label><%= f.check_box :by_job, {multiple: true}, "職業1" ,nil %>職業1</label> 10<label><%= f.check_box :by_job, {multiple: true}, "職業2" ,nil %>職業2</label> 11<label><%= f.check_box :by_job, {multiple: true}, "職業3" ,nil %>職業3</label> 12<label><%= f.check_box :by_job , {multiple:true}, "職業4",nil %>職業4</label>

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

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

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

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

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

guest

回答1

0

Controllerのby_jobを呼び出している部分の動く場合とダメな場合のコードの追記をお願いします。


たぶんControllerでは

ruby

1@items = Item.by_job(params[:item][:by_job])

のように利用されているという仮定で進めますが、

ruby

1scope :by_job, ->(input){ 2 joins(:applicant_basic).where("job1 = ? or job2 = ? or job3 = ? or job4 = ? or job5 = ?",input,input,input,input,input) 3 }

ruby

1scope :by_job, ->(input){ 2 input = Array(input) # 配列でwrapする。すでに配列なら何も起こらない 3 joins(:applicant_basic) 4 .where("job1 IN (?) or job2 IN (?) or job3 IN (?) or job4 IN (?) or job5 IN (?)",input,input,input,input,input) 5 }

にしてみたらどうでしょうか。

投稿2015/08/20 14:36

編集2015/08/21 05:04
hello-world

総合スコア1342

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

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

jusco

2015/08/21 02:24

情報を追記しました。よろしくお願いいたしますm(__)m
hello-world

2015/08/21 05:04

追記しました、どうでしょう
jusco

2015/08/21 06:14

ransackでの検索にあたり、他の条件での同時検索もあるので、コントローラーは以下のようになっています。 この場合だとどうなるでしょうか。 @q = Applicant.search(params[:q]) @applicants = @q.result(distinct: true)
hello-world

2015/08/21 06:29

すいません、 ransackのことは分かりかねます。 一応調べてみたものの、ransackのクエリパラメタがどのように named_scopeを呼び出すかの情報を見つけることができませんでした。
jusco

2015/08/22 11:19

ご回答有難うございました。 もうすこし調べてみますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問