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

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

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

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

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

解決済

[Ruby on Rails]複数条件でAND検索し、その結果をビューで表示させたい

clora
clora

総合スコア0

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

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

2回答

0評価

1クリップ

702閲覧

投稿2019/12/14 03:26

編集2022/01/12 10:58

前提

複数の条件に一致した時のデータを取得したいと考えています
検索条件は日付(date) AND グループid(group_id) AND 製品id(product_id)の三つです。

検索条件の三つの値をフォームに入力して検索しようとすると、

wrong number of arguments (given 0, expected 3)

という、エラーが出てしまいます。
これは、引数が渡せていないというエラーだということはわかっているのですが、検索の条件を満たす、引数を3つ渡した時だけ、given 0、となってしまいます。
試しに、渡す引数の数を一つや二つにすると、given 1,given 2となるので、引数は渡せていて、メソッドも呼び出されていると思うのですが(もちろんエラーは出ます)、引数を三つ渡した時だけエラーメッセージがgiven 0となり、検索できません。
searchメソッドの記述などを間違えているのでしょうか。それとも、引数の渡し方がおかしいのでしょうか。
DBには該当するデータは存在しています。
よろしくお願い致します。

発生している問題・エラーメッセージ

ArgumentError in Productions::SearchesController#search wrong number of arguments (given 0, expected 3) Extracted source (around line #8): 8 def self.search(date,line_id,product_id) 9 if search 10 Production.where ("(date = ?) AND (line_id = ?) AND (product_id = ?)", "%#{date}%", "%# {group_id}%", "%#{product_id}%") 11 redirect_to productions_searches_path

該当のソースコード

ruby

#route.rb Rails.application.routes.draw do root 'groups#index' namespace :productions do resources :searches, only: :index do collection do get 'search' end end end resources :groups do resources :productions end end

ruby

#/controllers/productions/searches_controller.rb class Productions::SearchesController < ApplicationController def index @production = Production.new end def search #Productモデルのcodeカラムに情報を取りにいってます product_id = Product.find_by(code: params[:production][:product_id]).id @production = Production.search(params[:production][:date], params[:production][:group_id], product_id) redirect_to search_productions_searches_path end end

ruby

#models/production.rb class Production < ApplicationRecord belongs_to :product belongs_to :group validates :date, presence: true validates :product_id, presence: true def self.search(date,group_id,product_id) if search Production.where ("(date = ?) AND (group_id = ?) AND (product_id = ?)", "%#{date}%", "%#{group_id}%", "%#{product_id}%") else redirect_to productions_searches_path end end

html

-# views/productions/searches/index.html <%= form_for [@production], url: search_productions_searches_path do |f| %> <div class="form__info__date"> <%= f.date_field :date %> #日付の入力 <%= f.number_field :products_id %> #productsのid(数字)を入力 <%= f.select :group_id, [["グループ1", 1],["グループ2", 2]] %> #グループidの入力 <%= f.submit '検索', class: "btn" %> </div> <% end %>

html

-# views/productions/searches/search.html -# 検索結果の出力画面は仮です <%= @production.date %> <%= @production.group_id %> <%= @production.product_id %>

試したこと

SearchesControllerのsearchメソッドを呼ぶ前でbinding pryして検索条件がきちんと入力されているか、確かめました。

ruby

#/controllers/productions/searches_controller.rb def search #Productモデルのcodeカラムに情報を取りにいってます product_id = Product.find_by(code: params[:production][:product_id]).id binding pry @production = Production.search (params[:production][:date], params[:production][:group_id], product_id) end

ruby

[1] pry(#<Productions::SearchesController>)> product_id => 1 [2] pry(#<Productions::SearchesController>)> params[:production][:group_id] => "1" [3] pry(#<Productions::SearchesController>)> params[:production][:date] => "2019-12-13"

この内容を見ると、値がnilにはなっていないとは思います。しかし、product_idがint型、group_idがstr型なのが気になりますが。
また、仮で、下記のようにsearchメソッドに直接数字などを渡してもやはり、三つ渡した時だけ、given 0となってしまいエラーになってしまいます。

ruby

#/controllers/productions/searches_controller.rb @production = Production.search("2019-12-13", "1", "1") @production = Production.search("2019-12-13", 1, 1)

実現したいこと

三つの条件を入力して、該当するデータを取得する

補足情報(FW/ツールのバージョンなど)

rails 5.0.7
ruby 2.5.1

追記

コメントで指摘を受けた部分を変更しました。
それに加えて、resultアクションを追加して、@production_resultに検索結果を挿入し、resultアクションで検索結果を表示させるようにしました。
しかし、@production_resultがnilになってしまい検索結果が表示されません。
どうもsearchメソッドを使用すると、@production_resultがから([])となってしまいます。
これは、検索結果がないということなのでしょうか?配列の中の値がnilとして返ってくるのならわかるのですが、配列自体が空になってしまいます。まだ、searchメソッドの記述がおかしいのでしょうか。
下記はsearchメソッドを使用した後、binding pryで確かめた結果です。

[1] pry(Production)> @production_result => nil

ruby

#route.rb Rails.application.routes.draw do root 'groups#index' namespace :productions do resources :searches, only: :index do collection do get 'search' end collection do get 'result' end end end resources :groups do resources :productions end end

ruby

#/controllers/productions/searches_controller.rb def search @production_result = Production.new product_id = Product.find_by(code: params[:production][:product_id]).id @production_result = Production.search(params[:production][:date], params[:production][:group_id], product_id) redirect_to result_productions_searches_path(@production_result) end def result end

ruby

def self.search(date,line_id,product_id) if date and group_id and product_id Production.where ("(date = ?) AND (group_id = ?) AND (product_id = ?)", "%#{date}%", "%#{group_id}%", "%#{product_id}%") else redirect_to productions_searches_path end end

html

-#views/productions/searches/result.html 検索結果 <%= @production_result.date %> <%= @production_result.group_id %> <%= @production_result.product_id %>
iddategroup_idproduct_id
262019-12-13 00:00:0011

試したこと

binding pryをしてみたところ、seaechメソッドをすると@production_resultが[]となってしまいます。

追記 part2

上記の状況から進展がありました。
@production_resultがnilになってしまうのはproduct_idの指定の仕方が間違えていたことによるものでした。
上の方にも書いた通り、product_idは他のテーブルに値を探しにいって変数product_idに入れて、searchメソッドに渡しています。その時にフォームから直接受け取ったgroup_idは"1"となっていたのに対し、product_idは 1 となっていました。そのため、そのまま、product_idを検索条件に入れてしまうと、条件に引っかからず、検索結果が0となり、@production_resulがnilになっているのでしたそこで下記のように、searchメソッドを書き直したところ、きちんと検索結果が、@production_resultに入ってくれました。

ruby

#production.rb def self.search(date,line_id,product_id) Production.where(date: date). where(group_id: group_id). where(product_id: "#{product_id}") end

ruby

[1] pry(#<Productions::SearchesController>)> product_id => 1 #こっちはただの数字 [2] pry(#<Productions::SearchesController>)> params[:production][:group_id] => "1" #こっちはダブルクォーテーションで囲まれている

ただ、まだ検索結果のビューでは、@production_resulはnilclassになってしまいますね、、、。
うまく変数が渡せていないだけだと思うのですが、、、。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

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