Rails3初心者のための金額絞り込み検索方法

このQ&Aのポイント
  • rails3を勉強中の初心者のために、DBに登録された商品の一覧から金額で絞り込み検索をする方法をご紹介します。
  • indexに検索結果が表示されない問題について、productsコントローラーのsearch_priceアクションのコードを説明します。
  • さらに、viewsファイルのコードについても説明し、初心者の方でも理解しやすくなるようにしました。
回答を見る
  • ベストアンサー

rails3初心者 金額から絞り込み検索

rails3を勉強中です。 ご教授いただけば幸いです。 実装したい事: DBに登録してあるproductsの一覧から金額を指定して絞り込み検索をしたい 解決してない事: indexに検索結果が表示されません。 コードの書き方をご教授いただければ幸いです。 ==================== views: ==================== <%= form_tag ({:controller => :products, :action => :search_price }), {:method => :post} do %> 価格指定 <%= text_field_tag "price1" %> ~  <%= text_field_tag "price2" %> <%= submit_tag "検索"%> <% end %> ==================== products_controller.rb ==================== def search_price @products = Product.all @product = Product.new @products.each do |product| item = product.price >= params[:price1].to_i && product.price <= params[:price2].to_i if item @product = product end end render :action => 'index' end ==================== views/products/index.html ==================== <% @products.each do |product| %> <%= product.name %> <%= product.price %> <% end %>

  • _rin
  • お礼率71% (25/35)
  • Ruby
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

def search_priceを以下のようにしてください def search_price @products = Product.where('price >=? AND price <= ?',params[:price1],params[:price2]) render :action => 'index' end ---------------------------------------------- 結果を表示する views/products/index.html では @productsに指定範囲のレコードが複数格納されていることを前提にしています。 しかしながら、 @products = Product.all で全レコードが取得されているため、その内容がそのまま(結果として)全レコード表示されます。 私が、記述した方法は、価格が指定範囲内に収まるレコードを取得してその結果を@products にセットしています。 全レコードを取得後、each do で、個々のレコードを参照する方法は、 全レコードの数が少ない場合は、問題ありませんが、多い場合(例えば数千件)は、パフォーマンス上 問題があります。多くのレコードの中からある条件を満足するレコードを取得する場合は、 通常、その処理をDB側に任せます。(つまり今回のようにwhereメソッドなどで範囲を指定します) そうすると、DB側でレコードの絞込みを行なうので、結果として返されるレコード数が非常に削減され レスポンスの向上につながります。

_rin
質問者

お礼

tatsu99様 _rinです。ご教授ありがとうございます。 出来ました!しかもシンプルなコードで書いてくださりありがとうございました。 教えてくださったコードを参考に、金額入力欄でどちらかが空白だった場合のコードも書けました。ありがとうございます。 def search_price @products = Product.where('price >=? AND price <=?', params[:price1],params[:price2]) @products = Product.where('price >=?', params[:price1]) if params[:price2].blank? @products = Product.where('price <=?', params[:price2]) if params[:price1].blank? render :action => 'index' end これにメーカーやカテゴリを含めた検索機能を応用で実装してみたいのですが、再度ご質問させていただいてもよろしいでしょうか? 絞込み検索内容 ========== ・メーカー (チェックボックス式) ・カテゴリ (チェックボックス式) ・金額指定 ========== 上記のように、絞り込み条件で、メーカーやカテゴリを選択してから、金額指定があれば、金額指定も含めて 検索結果を実装する事はできますか? ユーザーに押してもらうボタンはひとつにする形にしたいのですが、 def checkはgetで def search_priceはpostなので、 ややこしくなってしまい…^^;  再度ご教授いただければ幸いです。 ==================== views: ==================== <p>条件検索(複数選択可)</p> <%= form_tag ({:controller => :products, :action => :check }), {:method => :get} do %> <p>メーカーから探す</p> <% Maker.all.each do |maker|%> <%= check_box_tag "maker_id[]", maker.id, (params[:maker_id].include?(maker.id.to_s) if params[:maker_id]) %> <%= maker.maker_name %><br /> <% end %> <p>カテゴリから探す</p> <% Category.all.each do |c| %> <%= check_box_tag "category_id[]", c.id, (params[:category_id].include?(c.id.to_s) if params[:category_id]) %> <%= c.name %><br /> <% end %><br /> <%= submit_tag "検索"%> #このボタンを外してひとつのボタンにしたいです。 <% end %> <p>金額を指定して絞り込む</p> <%= form_tag ({:controller => :products, :action => :search_price }), {:method => :post} do %>  <%= text_field_tag "price1",(params[:price1] if params[:price1]) %> ~   <%= text_field_tag "price2",(params[:price2] if params[:price2]) %> <%= submit_tag "検索"%> <% end %> ==================== products_controller.rb ==================== def check @product = Product.all if params[:maker_id] && params[:category_id]   # 両方選択された場合 @products = Product.where(:category_id => params[:category_id], :maker_id => params[:maker_id] ) elsif params[:maker_id]   #makerが選択された場合 @products = Product.where(:maker_id => params[:maker_id]) if params[:maker_id] elsif params[:category_id]   #カテゴリが選択された場合 @products = Product.where(:category_id => params[:category_id]) if params[:category_id] elsif params[:maker_id] == nil && params[:category_id] == nil   #両方ともチェックがなかった場合 @products = Product.all end render :action => 'check' end def search_price @products = Product.where('price >=? AND price <=?', params[:price1],params[:price2]) @products = Product.where('price >=?', params[:price1]) if params[:price2].blank? @products = Product.where('price <=?', params[:price2]) if params[:price1].blank? render :action => 'index' end コードがややこしくてすみません^^; どうぞよろしくお願い致します。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

#1です。 参考までに全レコードを取得後、each do で条件を満足するレコードを絞り込む場合は 以下のようになります。 def search_price products = Product.all ・・・@をとり、ローカル変数にする @products = Array.new  ・・・@products を配列で定義する products.each do |product|  ・・・productsに対して処理する item = product.price >= params[:price1].to_i && product.price <= params[:price2].to_i if item @products << product ・・・@products に追加する(@productではないことに注意 ) end end render :action => 'index' end

関連するQ&A

  • rails3初心者 複数の絞込検索

    絞り込み条件で、メーカーやカテゴリを選択してから 金額指定があれば、金額指定も含めて検索結果を実装する事はできますか? またボタンは1個にする形にしたいです。 よろしくお願い致しますm(_ _)m 絞込み検索内容 ========== ・メーカー (チェックボックス式) ・カテゴリ (チェックボックス式) ・金額指定 ========== ==================== views: ==================== <p>条件検索(複数選択可)</p> <%= form_tag ({:controller => :products, :action => :check }), {:method => :get} do %> <p>メーカーから探す</p> <% Maker.all.each do |maker|%> <%= check_box_tag "maker_id[]", maker.id, (params[:maker_id].include?(maker.id.to_s) if params[:maker_id]) %> <%= maker.maker_name %><br /> <% end %> <p>カテゴリから探す</p> <% Category.all.each do |c| %> <%= check_box_tag "category_id[]", c.id, (params[:category_id].include?(c.id.to_s) if params[:category_id]) %> <%= c.name %><br /> <% end %><br /> <%= submit_tag "検索"%> #このボタンを外してひとつのボタンにしたいです。 <% end %> <p>金額を指定して絞り込む</p> <%= form_tag ({:controller => :products, :action => :search_price }), {:method => :post} do %>  <%= text_field_tag "price1",(params[:price1] if params[:price1]) %> ~   <%= text_field_tag "price2",(params[:price2] if params[:price2]) %> <%= submit_tag "検索"%> <% end %> ==================== products_controller.rb ==================== def check @product = Product.all if params[:maker_id] && params[:category_id]   # 両方選択された場合 @products = Product.where(:category_id => params[:category_id], :maker_id => params[:maker_id] ) elsif params[:maker_id]   #makerが選択された場合 @products = Product.where(:maker_id => params[:maker_id]) if params[:maker_id] elsif params[:category_id]   #カテゴリが選択された場合 @products = Product.where(:category_id => params[:category_id]) if params[:category_id] elsif params[:maker_id] == nil && params[:category_id] == nil   #両方ともチェックがなかった場合 @products = Product.all end render :action => 'check' end def search_price @products = Product.where('price >=? AND price <=?', params[:price1],params[:price2]) @products = Product.where('price >=?', params[:price1]) if params[:price2].blank? @products = Product.where('price <=?', params[:price2]) if params[:price1].blank? render :action => 'index' end ややこしくてすみません^^; どうぞよろしくお願い致します。

    • ベストアンサー
    • Ruby
  • rails3初心者 検索対象に別テーブルも含めたい

    ご教授よろしくお願いします。 <実装したい事> productテーブルからmakerテーブルのmaker_nameカラムも検索条件に含めたい。 (productテーブルの検索対象カラムは:codeとname ) (makerテーブルの検索対象カラムは:maker_name ) 以下のコードで試してみましたが、実装できません。 ========================= views ========================= <%=form_tag({:controller => :products,:action => :search}, :method => :get) do %> <%= text_field_tag "search_form",params[:search_form],:size =>25 %> <%= submit_tag '商品検索' %> <% end %> ======================================== products_controller.rb ======================================== def search @products =Product.find(:all, :include => :maker, :conditions =>['maker.maker_name like :value or code like :value or name like :value', {:value=> '%' +params[:search_form]+ '%'}]) end ======================================== リレーションシップ ======================================== product.rb belongs_to :maker **************************** maker.rb has_many :products **************************** どうぞよろしくお願い致します。

  • rails3初心者 検索結果を並べ変えたい

    検索結果で表示されたリストを、並べ替えができるようにしたいです。 現在はリンク先をクリックしても、実装できていません。 どこのコードがおかしいのかご教授いただければ幸いですm(_ _)m ======================= views ======================= <%= link_to "安い順", :action => 'low' %> <%= link_to "高い順", :action => 'high' %> <% @products.each do |product| %> 商品名<%= product.code %> 金額<%= product.price %> <% end %> ======================= controller.rb ======================= def check @product = Product.all   render :action => 'check' end def low @products = Product.find(:all, :order => "price ASC") render :action => 'check' end def high @products = Product.find(:all, :order => "price DESC") render :action => 'check' end ご教授よろしくお願い致します。

    • ベストアンサー
    • Ruby
  • rails3初心者 年齢を表示する

    rails3を勉強中です。 お詳しい方、ご教授いただけたら嬉しいです。 実装したい内容 プルボンタンで年齢「20」が選ばれた場合、 その結果を出力する(非モデル) ==================== views:presons/index.html ==================== <%= form_tag :action => :age do %> <%= select("form","age", (1..100))%> <%= submit_tag "表示する"%> <% end %> ==================== presons_controller.rb ==================== def index @preson = Preson.new end def age @preson = params[:form][:age] redirect_to :action => 'index' end ==================== views:presons/index.htmlで選択された 「20」を表示したいのですが、 そのコードの書き方をご教授ください。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Ruby
  • rubyで単純なwebアプリに検索機能の追加をする場合

    ruby初心者です。 rubyで最も単純なwebアプリを作りながら勉強しています。 DBに数個のカラムを作り、登録、修正、削除、表示させるだけのものを作って勉強しているのですが・・・ 検索の機能を追加する場合、 scaffoldで作成したコントローラ(仮にxxxs)←最初に作ったモデルの複数形 xxxs_controller.rbに def search @xxx_pages, @ = paginate :xxxs, :per_page => 10, :conditions => ["★★★ LIKE ?", params[:xxx][:検索対象のカラム名] + '%' ] @keyword = params[:xxx][:検索対象のカラム名] render :action => 'list' end を加える事と、 _form.rhtmlに <%= start_form_tag :action => 'search' %> <!-- (1) --> <%= text_field :xxx, :検索対象のカラム名, :value => @keyword %> <%= submit_tag 'Search' %> <%= end_form_tag %> 付け加えるだけでよいのでしょうか??

  • Rails コンボボックスの値の保持について(select_tag,c

    Rails コンボボックスの値の保持について(select_tag,collection_select) こんにちは。 Ruby on Railsで簡単な一覧検索画面を作成中の者です。 検索時の検索条件にコンボボックスを使用しており、検索後にコンボボックスの値を保持したいのですが、どうしてもできません。 どなたかお分かりの方がおられましたらご教授いただけないでしょうか。 下記、作成中のソースです。 Viewの検索条件部 <%- form_tag({:action => "search"},{:method=> "GET"}) do -%> <th class="U" align="left" width="10%"><label for="userNm">ユーザー名</label></th> <td width="90%"><%= text_field_tag :userNm, @userNm %></td>  <th class="U" align="left" width="10%"><label for="authCd">社員権限</label></th> <td width="90%">  <%= collection_select(:auth, :authCd, Auth.find(:all, :order => "AUTH_CD"), :id, :AUTH_NM, :include_blank => true) %>  <td align="center"><%= submit_tag '検索' %></td> Controllerクラス: def search #画面パラメータから検索条件を作成 c = Condition.new # ユーザー名 userNm = "" if params[:userNm] userNm = params[:userNm] c.and "USER_NM", "LIKE", "%#{userNm}%" end # コンボボックスの値を取得 if params[:auth] && !params[:auth]["authCd"].blank? c.and "AUTH_CD", params[:auth]["authCd"] end # 検索処理 @users = User.paginate(:order => "USER_ID asc", :per_page => 5, :page => params[:page], :conditions => c.where) # 検索条件保持 @userNm = params[:userNm] # コンボボックスの値が保持できない if params[:auth] @auth_authCd = params[:auth]["authCd"] end respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end 見づらくて申し訳ありませんが、ざっと上記のようになっています。 もう1つの検索条件であるユーザー名(userNm)は保持できるのですが、コンボボックス(社員権限)の値が保持できません。 select_tagや、selectも使ってみたのですが、どちらも同じ結果でした。 コンボボックスの条件は、Authモデルから値を読込み、一番上は空白にする。というものです。 どのように記述すれば保持できるのか色々調べてみたのですが、結局分からず仕舞いでした。。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Ruby
  • Rails3でのクリックされたボタンの判定について

    現在Rails3でWEBアプリの開発をしているのですが 実現方法が不明な事が有るので質問させて頂きました。 実行環境は   OS:Windows7   Railsバージョン:3.0.9   APサーバー:WEBrick です。 実現方法が不明なのは、一つのフォームに複数のサブミットボタンを配置し コントローラーでどのボタンが押されたのか判定する方法です。 ビューにおいてフォーム内に  <%= submit_tag 'OK', {:disable_with => "Sending…"} %>  <%= submit_tag 'CANCEL', {:disable_with => "Sending…"} %> と言う様にサブミットボタンを配置し コントローラーでどちらのボタンが押されたのかを判定する方法なのですが 検索して調べてみると  if 'OK' == params[:commit] then   OKボタンが押された際の処理  else   CANCELボタンが押された際の処理  end と言う風に出来ると言う情報を見つけたのですが、実際にやってみると 上記の様な値はparamsから取得出来ないので、正しく動作しません。 paramsで取得した値の中身を見ても、それらしい値も無く 何を判断すればどのボタンが押されたのかを判断出来るのかが判らず 非常に困っております。 サブミットボタンにjavascriptのコードを埋め込み 送信前にHIDDEN項目にクリックされたボタンを表す値を埋め込むと言った方法で 回避する事も可能かとは思いますが、標準的なやり方とも思えず また、良く行われる処理だと思いますので、他に方法が有る様に思えます。 どなたかご存知の方が居れば御回答お願いします。

    • ベストアンサー
    • Ruby
  • rails3初心者 画像にリンクを貼りたい

    ご教授いただければ幸いです。 ==================================== carts/index → carts/deliveryへリンクしたい =================================== button_toを使うとちゃんと動きますが <%= button_to "購入する" , :controller => 'carts', :action => 'delivery' %> 画像に替えると上手く動きません。 <%= link_to (image_tag ("/images/cart_next.png"),:size=>"180x40")),'/delivery',{:method => :post}) %> link_toやbutton_toを使用して画像にリンクを貼る方法はございますでしょうか? =================================== carts/controller.rb =================================== def index @cart = find_cart end# def find_cart session[:cart] ||= Cart.new end def delivery @cart = find_cart @addressee = Addressee.new() end

    • ベストアンサー
    • Ruby
  • rails3で複数条件から検索して表示、送信

    はじめましてrails初心者です。 皆さまの知恵をご拝借できればと思います。 以下やりたいこと、プログラム含め考え方をご教授いただければと思います。 尚、環境はails3.0.5です。 ----やりたいこと------------------------------------- ・留学エージェント検索サイト: ・参照サイトURL:http://www.ryugaku-seikatsu.net/Agent/AgentSearchShow/ ※行きたい国や目的を選んでそれに対応する留学エージェント会社を検索して、表示する。 --------------------------------------------------- ------考え方--------------------------------------- ※上記サイトを参考にお願いします。 ◆table構成 ・companies(name,email) ・countries ・purposes ・prefectures テーブル、countries、purposes、prefecturesに一致するcompanyを検索して、表示したく テーブルsearchesを作ろうとしています。 searchesテーブル company_id country_id purpose_id prefecturer_id そもそもこのテーブル設計で合っているのかがわかりません。country_id、purpose_id、prefecturer_id をcompany_idに紐付けしたくて上記のような構成になりました。 もっと効率のよいテーブル設計があればご教授ください。 そして、searchesテーブルを各テーブルにbelongs_toでアソシエーションさせて 検索しようと考えていますが、何か腑に落ちません。 また、searchesにidをつけたままの方のがよいのか、外した方がよいのかわかりません。 一応やってみたこととして searchコントローラーを作ってみました。 def search  @searches = Search.where(:country_id => params[:country_id]).where(:puropose_id =>  params[:purpose_id]).where(:prefecture_id => params[:prefecture_id]) end view(検索結果) <% @searches.companies.each do |company| %> <li><%= company.name %></li> <% end %> 上記を実行するとエラーでcompaniesが定義されていないとでてきます。 これもなぜだか、よくわりません。 ---------------------------------------------------------- ------その他わからないこと-------------------------------- 上記サイトを検索して進んでいくと、フォームを入力してフォームデータを送信します。 その際、情報送信先がユーザー、自分、companyだとします。 ユーザー、自分は問題なくできるのですが、検索結果にマッチしたcompany にフォームデータを送信する際に、どのように送信したらよいのかがわかりません。 一応、comapaniesテーブルにemailを入れているのですが、どのように紐付けしてよいの かがわかりません。 ---------------------------------------------------------- これまで、本やサイトで勉強していたのですが、自分のやりたいことに マッチしている情報が見つからなくて、困っています。 基本はRuby on Rails 3 アプリケーションプログラミング (著者 山田 祥寛 ) で勉強しておりますが、まだまだ勉強不足です。 http://www.amazon.co.jp/Ruby-Rails-%E3%82%A2%E3% … まだまだかなりの初心者ですが、何卒宜しくお願い申し上げます。

  • railsでアプリケーションコントローラーで宣言し

    rails3.1でアプリケーションコントローラーで宣言したインスタンス変数をビューで使いたいのですがnilが帰ってきます。参照する方法はあるでしょうか 以下のようになっています ●applicationコントローラー def example @test = "hoge" end ●アクションメソッド after_fileter :example def index ~~~ end ●ビュー <%= @test %> これでビューから@testがnilを返してしまいます よろしくお願いします。

専門家に質問してみよう