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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

Q&A

解決済

1回答

1562閲覧

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

katahabaR3sei

総合スコア9

Ruby

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/28 02:46

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

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

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

model

1def self.search(shop_params) 2 if shop_params 3  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]]) 4 else 5  Shop.all.order(id: "asc") 6 end 7end

contoller

1def search 2shop_params = 3 [params[:name],params[:genre_id],params[:pricerange_id],params[:address_id]] 4 @shops = Shop.search(shop_params) 5 @rate = Post.group(:shop_id).average(:rate) 6end

view

1<div class="col-md-12 text-center"> 2 <div class="form-group"> 3 <%= form_with url:search_shops_path, method: :get, local: true do |f| %> 4 <%= f.text_field :name, placeholder:"店舗名を入力" %> 5 <%= f.collection_select :genre_id, Genre.all, :id, :name, :prompt => "料理ジャンルで検索", class:"form-control"%> 6 <%= f.collection_select :pricerange_id, Pricerange.all, :id, :price, :prompt => "平均単価で検索", class:"form-control"%> 7 <%= f.collection_select :address_id, Address.all, :id, :prefectures, :prompt => "地域で検索", class:"form-control"%> 8 <%= submit_tag '検索' %> 9 <% end %> 10</div>

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

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

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

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

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

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

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

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

投稿2020/04/28 20:19

take77

総合スコア130

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

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

katahabaR3sei

2020/04/28 23: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 と書き直して修正しました所、希望通りの動きが実装できました! アドバイスありがとうございました!
take77

2020/04/29 00:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問