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 %>
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側でレコードの絞込みを行なうので、結果として返されるレコード数が非常に削減され
レスポンスの向上につながります。
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
コードがややこしくてすみません^^; どうぞよろしくお願い致します。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- スーパー・コンビニ ファミマの中濃ソースとセブンの中濃ソースってどちらの方が甘さ控えめですか? https://www. 1 2022/11/01 06:41
- その他(スマートフォン・携帯電話・VR) ガラホのテザリング機能を利用してとAmazonタブレット firehd8ネット見ることは出来ますか? 5 2022/11/24 06:49
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- デスクトップパソコン Minisforum 中国製のミニパソコン メモリが16 GB CPU 性能も高く お得? 3 2023/02/04 17:16
- 節約 キッチンペーパーについて ①最初から最後まで 取り出しやすい キッチンペーパー492円 https: 2 2023/04/22 21:02
- その他(AV機器・カメラ) 何型のUSB端子ですか。 2 2023/08/19 21:19
- iPod・ウォークマン・音楽プレーヤー オリンパスのICレコーダ V-801 の操作方法 3 2022/05/23 14:48
- 魚類 水槽照明の買い替えを検討中の初心者です。コスパが良いものがあれば教えてください! 1 2022/09/16 17:34
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1、Rstudioで回帰直線を求める...
-
パソコンのスクリーンセーバー...
-
C言語の入力した文字を反転させ...
-
教えてください
-
英数字を含む文字列(0-9,A-Z)...
-
7セグメント LED ディスプレイ ...
-
100万件越えCSVから条件を満た...
-
プログラミング
-
Excel関数と条件付き書式:製造...
-
(再質問)エクセルのマクロボ...
-
EXCEL 和暦入力
-
三項でたとえば交換って
-
なんで if __name__ == "__main__"
-
ビーリアルのユーザー名を変え...
-
pythonエラー
-
二進数で、1000 0000は、
-
【メモリ不足で落ちる(python)】
-
MacBookAir起動時にRubyソース...
-
PysimpleGUIでデータベースを作る
-
IDLE.Shell 3.10.0
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
windows embdded standard7
-
10円未満を切り捨てる方法は?
-
rails3初心者 金額から絞り込み...
-
Rails コンボボックスの値の保...
-
pythonのerrorコード
-
No route matches [GET] "/post...
-
パイソンのクラス
-
get() と find() の違いについて
-
Rubyについて質問です
-
ぱいソン
-
「arg」は何の略?
-
エクセルVBA オートフィルタで...
-
VBAで型が一致しないエラー(バ...
-
教えてください。vb5.0
-
クラス名やモジュール名の競合...
-
What class are you in? には何...
-
エラー「メソッドまたはデータ...
-
A1の値をファイル名に指定した...
-
実行時エラー450:引数の数が一...
-
HSTLやSSTL等のI/Oピン
おすすめ情報