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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビーリアルのユーザー名を変え...
-
プログラミング初学者の勉強方法
-
MacBookAir起動時にRubyソース...
-
再起動後必ず2つのエラーが出...
-
A4 持ち込み
-
前回の質問の続き
-
あせんうぶり言語
-
これらは書誌情報だと思うので...
-
情報の表現。()内がどうしても...
-
pythonのerrorコード
-
三項でたとえば交換って
-
WinSCPで画像のように puttyを...
-
パソコンのスクリーンセーバー...
-
こういう問題分をよんだとき
-
バーチャルボックスが使えなく...
-
なんで if __name__ == "__main__"
-
GitHubは初年度以外は有料にな...
-
ぱいソン
-
クリスタルレポートで困ってい...
-
パイソンのクラスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
windows embdded standard7
-
システムコンポサイズの短波ラ...
-
10円未満を切り捨てる方法は?
-
rails3初心者 金額から絞り込み...
-
Rails3でのYAMLファイルのtメソ...
-
「arg」は何の略?
-
What class are you in? には何...
-
教えてください。vb5.0
-
Csvファイルの最終行を取得する...
-
get() と find() の違いについて
-
エラー「メソッドまたはデータ...
-
class roomとclassroom どちら...
-
関数の引数に複数のユーザ定義...
-
実行時エラー450:引数の数が一...
-
クラス名やモジュール名の競合...
-
VBA/GetTickCountの49.7日の境...
-
VBAで型が一致しないエラー(バ...
-
pythonのerrorコード
-
テンプレートの特殊化でコンパ...
-
例外の再スロー時に、その原因...
おすすめ情報