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

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

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

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

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

539閲覧

Ruby の文法について includeや論理演算に関する質問

mnhy613

総合スコア21

Ruby

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

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/04/29 04:21

検索結果として表示させるものを限定させるコードを書いたつもりがうまく動きません。

検索結果として表示させたいものは

・商品名にチョコレートは絶対に含まれている
・(明治 meiji 森永 morinaga ロッテ Lotte 江崎グリコ グリコ ネスレ nestle マース mars モンデリーズ ナビスコ フェレロ FERRERO ハーシー)
これらのブランド名は1つ以上含まれていれば良い

この2つを満たす条件式として下記のようにしました。

Ruby

1if params[:keyword] 2 items = RakutenWebService::Ichiba::Item.search(keyword: params[:keyword]) 3 @items = [] 4 items.each do |item| 5 brand = %w(明治 meiji 森永 morinaga ロッテ Lotte 江崎グリコ グリコ ネスレ nestle マース mars モンデリーズ ナビスコ フェレロ FERRERO ハーシー) 6 7 if item.name.include?("チョコレート") and brand.any?{|m| item.name.include?(m)} 8 @items.push(item) 9 end 10 11 end 12 end

うまく動かず、明治とチョコレートが含まれた結果しか出ませんでした。

ご教示いただけると幸いです。

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

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

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

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

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

otn

2020/04/29 05:20

とりあえず、@items = [] の前でデバッガーで止めるかなにかして、 p items.map(&:name) してみましょう。思っていた内容と違うはずです。
guest

回答2

0

ベストアンサー

APIは使ったことないので難しいことは分かりませんが、

items = RakutenWebService::Ichiba::Item.search(keyword: params[:keyword])

Itemsに格納された値はどのようになっていますか?
出力したコードも何件分か記載頂けるとありがたいです。

投稿2020/04/29 04:53

gnfreeworks

総合スコア306

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

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

mnhy613

2020/04/29 05:00

知識が浅いため、答えになっているかわかりませんが => #<RakutenWebService::Ichiba::Item:0x000056157f5b8c50 @params= {"mediumImageUrls"=> ["https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/9700304_mother.jpg?_ex=128x128", "https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/9700304_473.jpg?_ex=128x128", "https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/imgrc0074570004.jpg?_ex=128x128"], "pointRate"=>1, "shopOfTheYearFlag"=>0, "affiliateRate"=>8, "shipOverseasFlag"=>0, "asurakuFlag"=>1, "endTime"=>"", "taxFlag"=>0, "startTime"=>"", "itemCaption"=> "【ネット限定】【送料無料】リンツ ショコラ カフェで販売中のリンドールチョコレートから22種のフレーバーがお試しいただけるテイスティング セット。 ○リンドール22種23個入り 愛らしく華やかな包みでおなじみのリンツの一番人気のチョコレート。 上質なチョコレートでできたシェルを破ると、この上なくなめらかなフィリングがお口の中で甘美にとけ始めます。 〇フレーバーカード付 リンツ直営店で販売中のリンドールのフレーバーがわかるフレーバーカードをご用意しています。 「マイベスト リンドール」を是非見つけて下さい! =================================== 楽天市場 年間ランキング2019年 「スイーツ・お菓子ランキング」12位獲得 =================================== 【内容量】23個 【原産国】イタリア、スイス、アメ リカ 【内容】22種23個(フレーバー)ミルク、ダーク、ホワイト、60%カカオ、70%カカオ、ヘーゼルナッツ、キャラメル、ストロベリー&クリーム、 マンゴー&クリーム 、ココナッツ、シトラス、ミルクオレンジ、カプチーノ 、ストラッチアテラ、シーソルト、ミルク&ホワイト、ファッジスワール、 キャラメルシーソルト、アーモンド、ミルクミント、抹茶、ピスタチオ 【パッケージサイズ】約195×125×40mm 【原材料】砂糖,植物油脂,ココアバター, 全粉乳,カカオマス,脱脂粉乳,乳糖,バターオイル,低脂肪ココア,ヘーゼルナ ッツ,キャラメルペースト,乳加工品,麦芽エキス,コーヒー,ピスタチオペースト,アーモンドペースト,乾燥ココナッツ,抹茶パウダー,塩,マンゴーピューレ,シトラス精油,ストロベリーパウダー,ミント精油,オレンジ精油,バニラビーンズ,植物レシチン(大豆由来),香料,着色料(ニンジンジュース,赤ビート色素,カボチャジュース,パプリカ色素),酸味料,アラビアガム 【アレルギー】ヘ ーゼルナッツ、アーモンドを使用した設備で製造しています。 ※賞味期限は1か月以上のものをお送りしております。 ======================= 商品の発送につきまして ======================= 「クール便」での配送となります。 ご希望のお届け日時を必ずご指定ください。 お届け予定日、3日以上経過いたしますと、お届が取りやめになる場合がございます。 何卒ご協力のほどよろしくお願いいたします。", "catchcopy"=>"リンツ 公式オンラインショップ", "tagIds"=>[1003810, 1011625, 1012703, 1017464], "smallImageUrls"=> ["https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/9700304_mother.jpg?_ex=64x64", "https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/9700304_473.jpg?_ex=64x64", "https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/imgrc0074570004.jpg?_ex=64x64"], "asurakuClosingTime"=>"12:00", "imageFlag"=>1, "availability"=>1, "shopAffiliateUrl"=> "https://hb.afl.rakuten.co.jp/hgc/g00sjjg7.jitq0b58.g00sjjg7.jitq17d6/?pc=https%3A%2F%2Fwww.rakuten.co.jp%2Flindt-chocolate%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Flindt-chocolate%2F", "itemCode"=>"lindt-chocolate:10000932", "postageFlag"=>0, "itemName"=> "送料無料 リンツ Lindt チョコレート リンドール 22種23個入り テイ スティングセット【チョコ ギフト かわいい 詰め合わせ おしゃれ お菓子 大量 ばらまき 個包装 プレゼント お返し 母の日 母の日ギフト 誕生日 輸 入菓子 お礼 スイーツ 花以外 メッセージカード付き】", "itemPrice"=>2980, "pointRateEndTime"=>"", "shopCode"=>"lindt-chocolate", "affiliateUrl"=> "https://hb.afl.rakuten.co.jp/hgc/g00sjjg7.jitq0b58.g00sjjg7.jitq17d6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Flindt-chocolate%2F9700304%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Flindt-chocolate%2Fi%2F10000932%2F", "giftFlag"=>0, "shopName"=>"リンツ チョコレートLindt", "reviewCount"=>1038, "asurakuArea"=>"富山県/石川県/福井県", "shopUrl"=> "https://hb.afl.rakuten.co.jp/hgc/g00sjjg7.jitq0b58.g00sjjg7.jitq17d6/?pc=https%3A%2F%2Fwww.rakuten.co.jp%2Flindt-chocolate%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Flindt-chocolate%2F", "creditCardFlag"=>1, "reviewAverage"=>4.74, "shipOverseasArea"=>"", "genreId"=>"410946", "pointRateStartTime"=>"", "itemUrl"=> "https://hb.afl.rakuten.co.jp/hgc/g00sjjg7.jitq0b58.g00sjjg7.jitq17d6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Flindt-chocolate%2F9700304%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Flindt-chocolate%2Fi%2F10000932%2F"}>
mnhy613

2020/04/29 05:01

検索バーでチョコレートと打つとこのような情報が返ってきます。 if params[:keyword] binding.pry items = RakutenWebService::Ichiba::Item.search(keyword: params[:keyword]) @items = [] binding.pryを上記のところに入れてターミナルで確認しました。
gnfreeworks

2020/04/29 05:09

そこでbinding.pryをしてしまうと`items`にどのような値が入ったか分かりませんので、 ``` if params[:keyword] items = RakutenWebService::Ichiba::Item.search(keyword: params[:keyword]) binding.pry @items = [] ``` ↑ここにbinding.pryを入れて、`puts items`などでターミナル出力された値を確認したいです。
mnhy613

2020/04/29 05:17

[1] pry(#<ChocolatesController>)> @items => [] [2] pry(#<ChocolatesController>)> items => #<RakutenWebService::SearchResult:0x000055850cd179a0 @client= #<RakutenWebService::Client:0x000055850cd17900 @resource_class=RakutenWebService::Ichiba::Item, @url= #<URI::HTTPS https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706>>, @params={:keyword=>"チョコレート"}, @resource_class=RakutenWebService::Ichiba::Item> [3] pry(#<ChocolatesController>)> items.first => #<RakutenWebService::Ichiba::Item:0x00007f81f43106c8 @params= {"mediumImageUrls"=> ["https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/9700304_mother.jpg?_ex=128x128", "https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/9700304_473.jpg?_ex=128x128", "https://thumbnail.image.rakuten.co.jp/@0_mall/lindt-chocolate/cabinet/imgrc0074570004.jpg?_ex=128x128"], "pointRate"=>1, "shopOfTheYearFlag"=>0, "affiliateRate"=>8, "shipOverseasFlag"=>0, "asurakuFlag"=>1, "endTime"=>"", "taxFlag"=>0, "startTime"=>"", "itemCaption"=> "【ネット限定】【送料無料】リンツ ショコラ カフェで販売中のリンドールチョコレートから22種のフレーバーがお試しいただけるテイスティング セット。 ○リンドール22種23個入り 愛らしく華やかな包みでおなじみのリンツの一番人気のチョコレート。 上質なチョコレートでできたシェルを破ると、この上なくなめらかなフィリングがお口の中で甘美にとけ始めます。 〇フレーバーカード付 リンツ直営店で販売中のリンドールのフレーバーがわかるフレーバーカードをご用意しています。 「マイベスト リンドール」を是非見つけて下さい! =================================== 楽天市場 年間ランキング2019年 「スイーツ・お菓子ランキング」12位獲得 =================================== 【内容量】23個 【原産国】イタリア、スイス、アメ リカ 【内容】22種23個(フレーバー)ミルク、ダーク、ホワイト、60%カカオ、70%カカオ、ヘーゼルナッツ、キャラメル、ストロベリー&クリーム、 マンゴー&クリーム 、ココナッツ、シトラス、ミルクオレンジ、カプチーノ 、ストラッチアテラ、シーソルト、ミルク&ホワイト、ファッジスワール、 キャラメルシーソルト、アーモンド、ミルクミント、抹茶、ピスタチオ 【パッケージサイズ】約195×125×40mm 【原材料】砂糖,植物油脂,ココアバター, 全粉乳,カカオマス,脱脂粉乳,乳糖,バターオイル,低脂肪ココア,ヘーゼルナ ッツ,キャラメルペースト,乳加工品,麦芽エキス,コーヒー,ピスタチオペースト,アーモンドペースト,乾燥ココナッツ,抹茶パウダー,塩,マンゴーピューレ,シトラス精油,ストロベリーパウダー,ミント精油,オレンジ精油,バニラビーンズ,植物レシチン(大豆由来),香料,着色料(ニンジンジュース,赤ビート色素,カボチャジュース,パプリカ色素),酸味料,アラビアガム 【アレルギー】ヘ ーゼルナッツ、アーモンドを使用した設備で製造しています。 ※賞味期限は1か月以上のものをお送りしております。 ======================= 商品の発送につきまして ======================= 「クール便」での配送となります。 ご希望のお届け日時を必ずご指定ください。 お届け予定日、3日以上経過いたしますと、お届が取りやめになる場合がございます。 何卒ご協力のほどよろしくお願いいたします。", "catchcopy"=>"リンツ 公式オンラインショップ", "tagIds"=>[1003810, 1011625, 1012703, 1017464], このような結果になりました。 答えになっていますでしょうか?
gnfreeworks

2020/04/29 06:09 編集

ありがとございます。 paramsの情報だけだとやはりよくわからないですね、すみません。 あとは地道に確認するしかないのですが、 -------------- brand = %w(明治 meiji 森永 morinaga ロッテ Lotte 江崎グリコ グリコ ネスレ nestle マース mars モンデリーズ ナビスコ フェレロ FERRERO ハーシー) binding.pry if item.name.include?("チョコレート") and brand.any?{|m| item.name.include?(m)} ------------------ のように、brand = とif の間にbinding.pryを入れて実行すると止まると思いますが、 その時に商品名を   item.name で確認し、チョコレートを含んでいるか   item.name.include?("チョコレート") でTrueが返ってくるかを確認し、メーカー名を含んでいるか   brand.any?{|m| item.name.include?(m)} でTrueが返ってくるのを1件ずつ試してみて、 本来@Itemsに入るはずなのに入らない原因を絞り込んでいくしかないと思います。
mnhy613

2020/05/03 16:43

ありがとうございました 試してみます。
guest

0

APIから引いてくる時点での問題ではないでしょうか。

if部分での問題は再現しません(paiza.io)。

投稿2020/04/29 04:39

maisumakun

総合スコア145184

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

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

mnhy613

2020/04/29 04:48

APIから引いてきた商品名はnameメソッドが使えます。 if item.name.include?("チョコレート") この部分だけであれば機能しています。
maisumakun

2020/04/29 05:01

API側の個数制限などで、元から「明治とチョコレートが含まれた結果しか」なかった、ということはないですか?
mnhy613

2020/04/29 06:54

個数制限といいますと、一度に取得できる情報のことですか? 例えば、一度に30個までしかチョコレート検索結果を読み込めず (明治 meiji 森永 morinaga ロッテ Lotte 江崎グリコ グリコ ネスレ nestle マース mars モンデリーズ ナビスコ フェレロ FERRERO ハーシー) これらが入った検索結果として明治とチョコレートが含まれているものが 30この中には1つしかなかったということでしょうか?
mnhy613
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問