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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

4142閲覧

modelの検索条件に「or」を追加する。

koppe1989

総合スコア27

Ruby on Rails

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2015/10/26 05:39

お世話になっております。

informationモデルのnameというカラムにデータを保存し、その検索ワードごとにレコード保存結果を表示させたいと考えております。しかし検索ワードの条件がorになったときに表示させることができません。
検索方法をご教授ください。

検索条件:search_word1に該当

class InfojsonController < ApplicationController def index search_word1 = "neko" @information = Information.where(Information.arel_table[:name].matches("%#{search_word1}%")).all render :json => @information.order("date DESC") #日付でならべる end end

条件:search_word1 or search_word2 に該当

class InfojsonController < ApplicationController def index search_word1 = "neko" search_word2 = "ALL" render :json => @information.order("date DESC") #日付でならべる end end

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

Arelで複雑なクエリを書くのもややこしいので、それを便利にしたSqueelというのが便利です。

これを使うと、or条件でもスイスイ書けます。

ruby

1 search_word1 = "neko" 2 search_word2 = "ALL" 3 @information = Information.where{ (name =~ "%#{search_word1}%") | (name =~ "%#{search_word2}%") }

なお、本題とは関係ありませんが、

  • コントローラーで直接クエリをかけるのはあまり良くありません。モデルで必要なmethodやスコープを定義して、それを使いましょう。
  • whereの後の.allは、特に意味がありません。しなくても、自動でコレクションに開いてくれます。

投稿2015/10/26 06:08

maisumakun

総合スコア145183

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

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

0

自己解決

今回はこのようにさせていだだきました。

search_word1 = "ALL" search_word2 = "neko" karamu = Information.arel_table[:name] @information = Information.where(karamu.matches("%#{search_word1}%").or(karamu.matches("%#{search_word2}%") ))

お二方のやり方どちらも挑戦させていただいたのですが、未熟ゆえ対応できませんでした。今回はこちらでお願い致します。またよろしくお願いします

投稿2015/10/28 12:08

koppe1989

総合スコア27

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

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

0

Arelで書いてみます。

Ruby

1search_words = ['ALL', 'neko', 'inu'] 2info_table = Information.are_table 3conditions = info_table[:name].matches("%#{search_word[0]}%") 41.upto(search_word.length-1) do |index| 5 conditions = conditions.or(info_table[:name].matches("%#{search_word[index]}%") 6end 7return Information.where(conditions).order(info_table[:date].desc)

こんな感じで、条件部をオブジェクト化してしまえば、
かなり複雑な条件に対応可能です。
(複数テーブルをOuterJoinして、それぞれのテーブルにandやor条件がつくような場合でも可能)

なお、maisumakunさんがおっしゃっているように、whereの後のallは必要ありません。
Arelの場合、遅延評価されるので、実際に値が必要なるまでは、SQLを発行しないためです。
必要になるのは、カウントが必要になったときや、内容の実体が必要になったときです。
(ちなみに、.eachでループを回すときや、.all, .first, .lastなどの時までSQLは動きません)

Squeel、見てみるとだいぶ簡単に書けそうですね。
勉強不足で知りませんでした。

投稿2015/10/26 08:58

rifuch

総合スコア1901

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問