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

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回答

913閲覧

ransackによる検索について

arinc0

総合スコア31

Ruby

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

SQL

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

Ruby on Rails

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

0グッド

1クリップ

投稿2020/01/14 07:09

編集2020/01/14 07:54

ransackにより検索機能を実装しようとしているのですが、特定のカラムに関してうまく検索ができない状態になっております。調べてみたのですがうまく改善できない為アドバイスなど頂けたらと思います。

[43] pry(main)> Spree::Product.ransack(name_cont: "bac").result => Spree::Product Load (1.0ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`name` LIKE '%bac%' []

Spree::Productnameカラムに関しては検索が正常に行われるのですが、

[51] pry(main)> Spree::Product.ransack(description_cont: "abc").result => Spree::Product Load (1.2ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL

descriptionカラムに関しては検索が正常に行われません。

namestring型でdescriptiontext型なのでそこでうまく処理が行われていないのでは?と思って調べていますがいい結果が得られません。

text型だと特別な手順が必要なのでしょうか?
参照記事やアドバイスなど頂けたらと思います。

---追記------------------------------------------↓
わかりにくくてすみません。
検索条件がうまく渡されないのを改善したいと考えております。

[65] pry(main)> Spree::Product.where("description LIKE ?", "%BBB%") => Spree::Product Load (1.2ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND (description LIKE '%BBB%') [] [66] pry(main)> Spree::Product.where("name LIKE ?", "%BBB%") => Spree::Product Load (1.8ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND (name LIKE '%BBB%') [] [67] pry(main)> Spree::Product.ransack(name_cont: "AAA").result => Spree::Product Load (1.2ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`name` LIKE '%AAA%' [] [68] pry(main)> Spree::Product.ransack(description_cont: "AAA").result => Spree::Product Load (3.2ms) SELECT `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL

65,66行目に関しては直接LIKE検索をすると正常に検索が行われるのですが、
66,67行目に関してransackを使用すると、nameは問題なく検索が行われ、descriptionに関してはうまく検索が行われません。
お手数ですが確認お願い致します。

erb

1<li class="dropdown searchBox"> 2 <%= link_to "javascript:void(0)", class: "dropdown-toggle", 'data-toggle': :dropdown do %> 3 <i class="fa fa-search"></i> 4 <% end %> 5 <ul class="dropdown-menu dropdown-menu-right"> 6 <%= form_with url: potepan_products_search_path, id: "form01", method: :get, local: true do |form| %> 7 <li> 8 <span class="input-group"> 9 <%= form.text_field "searchWord", class: "form-control", placeholder: "Search…", 'aria-describedby': "basic-addon2" %> 10 <span type="btn" class="input-group-addon addPointer" id="basic-addon2">検索 </span> 11 </span> 12 </li> 13 <% end %> 14 </ul> 15</li> 16

controller

1def search 2 @searchWord = params[:searchWord] 3 searched_products = Spree::Product.ransack(description_cont: params[:searchWord]).result.includes(variants_including_master: %i[images prices]) 4 @products = searched_products 5 end

ちなみにコントローラーのdescription_contname_contとした場合には正常な動作を確認しております。合わせて確認いただけたらと幸いです。

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

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

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

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

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

FKM

2020/01/14 07:14 編集

後者は検索条件がnullになっているのですが、データはうまくコントローラに送られているのでしょうか?
FKM

2020/01/14 07:46

検索側のテンプレートの表示もお願いします。erb、haml、slimのどれかという表示も忘れずに
shinoharat

2020/01/14 08:09

もしやとは思いますが、Spree::Product に ransackable_attributes が定義されている(かつそこに description が含まれていない)なんてことはないですよね?
shinoharat

2020/01/14 08:13

"description" のスペルが間違っているという可能性も少し浮かんだのですが、 ``` Spree::Product.where("description LIKE ?", "%BBB%") ``` がエラーになっていないならその線はなさそうですね。。。
arinc0

2020/01/14 08:38

shinoharatさん Spree::Productを確認したところ、 self.whitelisted_ransackable_attributes = %w[name slug] と書いてありました。 おそらくご指摘のとおりかと思います。。。 slugに関しては検索が正常に行われたのが確認済みです。 既に導入されていた為、使用方法だけ見て試行錯誤していました。 使用するgemに関しては導入からしっかりと確認したいと思います。 ご指摘ありがとうございました。
shinoharat

2020/01/14 08:46

おおお!よかったです! 大手の gem は未知の機能が沢山あったりして覚えるの大変ですよね その分使いこなせれば強力なんですが 一応 ransackable_attributes の件を回答欄に転記しておきます!
guest

回答1

0

ベストアンサー

Spree::Product モデルに whitelisted_ransackable_attributes が指定されているのが原因のようです。

rb

1self.whitelisted_ransackable_attributes = %w[name slug]

上記のリストに description を付け加えればうまく動くのではないかと思われます。

投稿2020/01/14 08:50

shinoharat

総合スコア1676

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問