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

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

ただいまの
回答率

87.48%

複数条件検索機能実装エラーで困っています。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 608

複数条件検索機能実装エラーで困っています。

view画面
https://gyazo.com/333dceaa62e9bb1dbdee9f03989f2bd6

検索ワードを入力した画面
https://gyazo.com/7d94eddee07b6ba33c871f25b48f0ffe

def self.search(shop_params)
 if shop_params
  Shop.where(["name LIKE ? OR genre_id = ? OR pricerange_id = ? OR address_id = ?", "%#{shop_params[0]}%",shop_params[1],shop_params[2],shop_params[3]])
 else
  Shop.all.order(id: "asc")
 end
end
def search
shop_params = 
 [params[:name],params[:genre_id],params[:pricerange_id],params[:address_id]]
 @shops = Shop.search(shop_params)
 @rate = Post.group(:shop_id).average(:rate)
end
<div class="col-md-12 text-center">
 <div class="form-group">
  <%= form_with url:search_shops_path, method: :get, local: true do |f| %>
   <%= f.text_field :name, placeholder:"店舗名を入力" %>
   <%= f.collection_select :genre_id, Genre.all, :id, :name, :prompt => "料理ジャンルで検索", class:"form-control"%>
   <%= f.collection_select :pricerange_id, Pricerange.all, :id, :price, :prompt => "平均単価で検索", class:"form-control"%>
   <%= f.collection_select :address_id, Address.all, :id, :prefectures, :prompt => "地域で検索", class:"form-control"%>
   <%= submit_tag '検索' %>
  <% end %>
</div>


修正したブランチのコード
https://github.com/katahabaR3sei/foodapp/tree/feature-area-search

マスタブランチのコード
https://github.com/katahabaR3sei/foodapp/tree/master

マスターブランチでは店舗名での検索が可能になっていますが
現在のブランチですと、店舗名かつ〇〇ジャンルや○○ジャンルかつ〇〇地域などの複数条件での検索を実装しようとして、エラーが発生しております。

pryを使い確認した上でparamsも取得できていると思うのですが、shop.rbの記述が間違っているのか
エラーが解消されません。

ご確認よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

私を教えを請う立場なので如何ともし難いのですが…。

まず、エラー内容は「整数がほしいけど、この入力は間違ってるよ」といったところでしょうか。
paramsを見るとわかると思うのですが、渡っている値が '19' の用に文字列ーstring型になっているように思います。
とりあえず、これをinteger型に修正すればエラーは解消されると思うのですが、どうでしょうか…。
確かparamsって普通に使おうとすると、まるっとするっと文字列になって返ってきちゃうんじゃありませんでしたっけ?

…あと、差し出がましいかもしれませんが、コードがその…なんというか…変則的になっている部分があることが問題の解決を妨げているのではないでしょうか…?
具体的には以下のような項目を調べていただけるとよいかと…。

・rubyの型について:今回のエラーはrubyで取り扱うデータの型(正確なものいいかどうかは自身がありません)の整合性が取れていないことに起因する用に思います。一度見直されると案外すんなり行くかもしれません。
・paramsの扱いについて:今回のコードではshop_paramsを改めて作られているようですが、paramsはhashに近い形状で渡ってきますので、引数としてある程度そのまま使えるはずです。…渡してくれたものを素直に使ったほうがミスも減るのでいいと、個人的には考えているのですが…。
・scopeについて:個人的にはRailsにおいてはクラスメソッドよりもscopeを多用している気がしております。メリットは簡潔に記述できることと、役割を分割できることとかでしょうか?連続して書くこともできるので、複数条件を使うときにも割と便利だと思っています。

このあたりをさらっと見直してからもう一度実装し直したりすると、案外さくっと動いたりしてくれるかもしれません。私はよく沼にハマると一度実装に必要な情報を洗い直して書き直しています。
…はい、基本的には趣味として浅瀬で砂山作ってるような人の話なので、スルーしていただいて大丈夫です。
ポートフォリオとして作られているようでしたので、どこまで言及していいのか迷ってしまいました…。

一応、多少の間違いはあっても根本的にマイナスになることは言っていない…ハズ…です…。
公式ドキュメントとか、根本的な仕様とかみるとさくっとわかることも多かったので、参考になれば幸いです。

追記:Ruby及びRailsのプロダイバーの方へ。おかしな部分があれば、タコ殴りにして修正していただければと思います。よろしくお願いいたします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/29 08:08 編集

    ご回答ありがとうございます!

    おっしゃる通り、色々迷って変数shop_paramsなどを使ってしまいました。。。

    scopeは調べてみたのですが、少し理解が浅くて一旦忌避してしまいました。。。
    この機会に少し深堀してみようかなと思います!

    データ型はとりあえず「.to_i」メソッドを付けて回避したのですが、強引にエラーのみ回避しようとしていたので一旦0にして考えて

    def self.search(shop_params)
    shops = Shop.all
    shops = shops.where("name LIKE ?", "%#{shop_params[0]}%") if shop_params[0].present?
    shops = shops.where(genre_id: shop_params[1]) if shop_params[1].present?
    shops = shops.where(pricerange_id: shop_params[2]) if shop_params[2].present?
    shops = shops.where(address_id: shop_params[3]) if shop_params[3].present?
    shops.order(id: "asc")
    end

    と書き直して修正しました所、希望通りの動きが実装できました!

    アドバイスありがとうございました!

    キャンセル

  • 2020/04/29 09:28

    お力になれたようでよかったです。
    一点だけ補足をしておくと、paramsはhashの形にしておくと可読性が増すように思います。

    お互い今後も頑張りましょう。

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る