Rails3初心者のための検索結果並べ替えの方法

このQ&Aのポイント
  • 検索結果で表示されたリストを並べ替え可能にしたい場合、Rails3を使用しています。現在、リンクをクリックしてもリストが並べ替えられません。どの部分のコードが問題なのか教えてください。
  • Rails3初心者のための検索結果並べ替えの方法は、リンクをクリックするとリストが並べ替えられるようにしたい場合に役立ちます。現在は実装されておらず、どのコードが間違っているのか教えていただけますか?
  • Rails3の検索結果のリストをクリックして並べ替えたい場合、現在は正しく動作していません。どのコードが問題なのか教えていただけますか?
回答を見る
  • ベストアンサー

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 ご教授よろしくお願い致します。

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

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

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

すみません。#2の回答も的外れでした。 viewの@productsに正しい値が設定されていないのは、 def check @product = Product.all   render :action => 'check' end の @product = Product.allが原因です。 これを @products = Product.all として下さい。(@productを@productsにする) 尚、view側も見やすくするために =================================== <%= link_to "安い順", :action => 'low' %> <%= link_to "高い順", :action => 'high' %> </br>               ・・・ここに改行をいれる <% @products.each do |product| %> 商品名<%= product.code %> 金額<%= product.price %></br>  ・・・ここに改行をいれる <% end %> =================================== とすると良いかと思います。

_rin
質問者

お礼

ご教授ありがとうございます。 def checkを修正して実装できました。 >@product = Product.allが原因です。 お手間をおかけしまして、すみません。 ありがとうございました。 @products = Product.order("price") @products = Product.order("price DESC")

その他の回答 (2)

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

すみません。#1の回答は的外れでした。 @products = Product.find(:all, :order => "price ASC") と @products = Product.order('price ASC') は同じ結果が得られますので、ソートの指定が誤っているわけではないようです。 (今後は、後者を推奨します) こちらで、viewをその通りに作成し、実行したところ NoMethodErrorが発生しましたので、それが原因かと思います。 view側を以下のように修正してください。 ================================== <%= link_to "安い順", :action => 'low' %> <%= link_to "高い順", :action => 'high' %> <% if @products %> ・・・・・・・この行を追加 <% @products.each do |product| %> 商品名<%= product.code %> 金額<%= product.price %></br>   ・・・本質的な部分ではないが見やすくするために</br>を追加 <% end %> <% end %> ・・・・・・この行を追加 =============================== @products になにも設定されていない場合は、表示しないように変えました。

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

以下のようにしてください。 @products = Product.find(:all, :order => "price ASC") を @products = Product.order('price ASC') @products = Product.find(:all, :order => "price DESC") を @products = Product.order('price DESC') rails3.x では、このような書き方に変わっています。 Product.find(:all, :order => "price DESC")の書き方は、 rails2.xの記述方法なので、現在は非推奨になっています。

関連するQ&A

  • 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 %>

    • ベストアンサー
    • Ruby
  • 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 **************************** どうぞよろしくお願い致します。

  • Ruby on Rails に関する質問です。

    Ruby on Rails でデータベースにあいまい検索を複数条件でかけたいのですが、どのようにしたらよいのでしょうか?? def find   @bookinfo= Bookinfo.find(:all, :conditions => ["title like ?" => ["author like ?", "%#{params[:key]}%"]]) render :action => 'result.html.erb' end このような感じで複数のあいまい検索をかけたいのですがどのようにすればよいのか教えてください。 お願いします。SQLite3を使用しています。

    • ベストアンサー
    • 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初心者 年齢を表示する

    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
  • Rails3でAjaxを使いたい

    どなたが知識をご教授下さい。 Rails3でAjaxのごく普通のハイパーリンクを作成したいのですが、うまくいきません。 /users/index.html.erb <div id="hoge"> <%= link_to "ajax",{:action => 'draw'},:remote => true %> </div> -- /users/_draw.html.erb ~いろいろ内容~ -- /users/draw.js.erb $('#hoge').html("<%= escape_javascript(render :partial => 'draw' )%>"); -- /users_controller.rb def draw ~いろいろ処理~ end -- ルーティング match 'users/draw' => 'users#draw' -- application.html.erb <%= javascript_include_tag :defaults %> -- gemfile gem 'jquery-rails' 以上のように処理するよう様々なサイトや書籍にはありましたが、「Templete Missing」のエラーが出てしまいます。かれこれ5時間以上ハマってまして、、、 どなたか知識をご教授頂けたら幸いです。 *メモ アクションdrawに渡ったときに、 「request.xhr?がfalse」ということは、ajax通信できていないということでしょうか???

    • ベストアンサー
    • Ruby
  • foreach内でのデータベース登録

    MDB2を使用しております。配列の値をforeach内でのデータベースに 登録をしたく以下のようなソースでやっているのですが MDB2 Error: constraint violationとエラーが出てしまいます。 長文となりますが以下が詳細です。 $products_dataのデバッグ結果 Array ( [130_df08024b_S_0] => Array ( [num] => 1 [products_id] => 130 [products_code] => df08024b [name] => 商品名1 [tax] => 84 [price] => 1680 [classcategory_name1] => S [classcategory_name2] => 0 [classcategory_id1] => 56 [classcategory_id2] => 0 [point_rate] => 10 [add_point] => 168 ) [140_df08024c_M_0] => Array ( [num] => 1 [products_id] => 140 [products_code] => df08024c [name] => 商品名2 [tax] => 53 [price] => 1050 [classcategory_name1] => M [classcategory_name2] => 0 [classcategory_id1] => 46 [classcategory_id2] => 0 [point_rate] => 10 [add_point] => 105 ) ) foreach ($products_data as $key => $val) { foreach ($val as $key2 => $val2) { // 変数に代入 $$key2 = mysql_real_escape_string($val2); } $fields2[$key] = array('order_id' => $order_id, 'product_id' => $products_id, 'product_name' => $name, 'product_code' => $products_code, 'classcategory_id1' => $classcategory_id1, 'classcategory_id2' => $classcategory_id2, 'classcategory_name1' => $classcategory_name1, 'classcategory_name2' => $classcategory_name2, 'price' => $price, 'num' => $num, 'point_rate' => $point_rate); // INSERT文生成 $res = $mdb2->extended->autoExecute(products_order_detail, $fields2[$key], MDB2_AUTOQUERY_INSERT); } print_r($fields2) 以下デバッグの結果です。思うようにデータは入っております。 Array ( [130_df08024b_S_0] => Array ( [order_id] => 370139549628 [product_id] => 130 [product_name] => 商品名1 [product_code] => df08024b [classcategory_id1] => 56 [classcategory_id2] => 0 [classcategory_name1] => S [classcategory_name2] => 0 [price] => 1680 [num] => 1 [point_rate] => 10 ) [140_df08024c_M_0] => Array ( [order_id] => 370139549628 [product_id] => 140 [product_name] => 商品名2 [product_code] => df08024c [classcategory_id1] => 46 [classcategory_id2] => 0 [classcategory_name1] => M [classcategory_name2] => 0 [price] => 1050 [num] => 1 [point_rate] => 10 ) ) 商品が1つの場合であればうまく動作するのですが2つ以上になると やはりエラーとなってしまいます。 複数の場合のみのエラーなので簡単な間違いかと思いいろいろ考え 試してみたのですが原因がわからずにいる状態です。 どのように変更すればいいものでしょうか?宜しくお願い致します。

    • ベストアンサー
    • PHP
  • DBから取得したデーター+配列データーの受取り

    (過去に似たような質問をしたのですが、その続きの質問です。) よろしくお願いします。 ※セッションID(以下(3)のDBのカラム(ssid)で使用)を 発行した状態で以下を行いたいのですが、(3)がうまくいきません。 (1)商品リストのDBを以下のように作り -------------------------------------------- (テーブル:products) product_id | product_cd | name | price 1 | 10 | 本01   | 1300 2 | 11 | 本02     | 1200 3 | 20 | サプリ01    | 4800 4 | 30  | ストレッチボード | 9800 5 | 30 | 健康シューズ   | 6800 -------------------------------------------- (2)上記をmysql_fetch_arrayで取り出し<table>を作成。 その際に、商品選択をする(checkbox)と(数量)を入力する<input> を加え<form>でkaimonoKago.phpへ送信します。 (products.php) <?php (途中省略) mysql_query("set names utf8"); $sql = "select * from products "; $result = mysql_query($sql) ; ?> <form method="post" action="kaimonoKago.php"> <table> <tr> <th></th> <th>商品コード</th> <th>商品名</th> <th>価格(税込</th> <th>数量</th> </tr> <?php while($row = mysql_fetch_array($result)){ print "<tr>\n"; print "<th><input type=\"checkbox\" name=\"check[]\" value=\"".$row["product_id"]."\"></th>\n"; print "<td>".htmlspecialchars($row["product_cd"])."</td>\n"; print "<td>".htmlspecialchars($row["product_name"])."</td>\n"; print "<td>&yen;".number_format($row["price_intax"])."</td>\n"; print "<td><input type=\"text\" name=\"kazu[".$row["product_id"]."]\" size=\"3\"></td>\n"; print "<input type=\"hidden\" name=\"ssid\" value=\"".$_SESSION['ssid']."\" />\n"; print "</tr>\n"; } ?> <input type="submit" name="order" value="注文" /> </form> (3)<form>で送られてきた情報を、買い物カゴDB ----------------------------------------------- (テーブル名:kaimonoKago) (カラム: ssid, product_cd, product_name, price_intax, kazu, shoukei) ----------------------------------------------- にインサートしたいのですが、うまくいきません。正しい記述を教えて下さい。 mysql_fetch_arrayやらwhile文やら配列が2つあったりして、どのように組み立てたら いいのか、基本的な考え方も教えていただければ幸いです。 (自分がつくった、うまくいかないコード)    ↓ (kaimonoKago.php) $check=(isset($_REQUEST["check"]) and is_array($_REQUEST["check"]))?$_REQUEST["check"]:array(); $kazu=(isset($_REQUEST["kazu"]) and is_array($_REQUEST["kazu"]))?$_REQUEST["kazu"]:array(); foreach($check as $val){ if($kazu[$val]>0){ $sql = "select * from products where product_id ='" . mysql_real_escape_string($val) . "'"; $result = mysql_query($sql); while($products = mysql_fetch_array($result)){ $product_cd = $products['product_cd']; $product_name = $products['product_name']; $price_intax = $products['price_intax']; $kazu = $kazu[$val]; $shoukei = $price_intax * $kazu; $sql = "insert into kaimonoKago ( ssid, product_cd, product_name, price_intax, kazu, shoukei ) values ( '" . mysql_real_escape_string ( $_SESSION['ssid'] ) . "', '" . mysql_real_escape_string ( $product_cd ) . "', '" . mysql_real_escape_string ( $product_name ) . "', '" . mysql_real_escape_string ( $price_intax ) . "', '" . mysql_real_escape_string ( $kazu ) . "', '" . mysql_real_escape_string ( $shoukei ) . "' )"; mysql_query($sql); } } } } よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLのレコードを検索、検索結果を保持したまま並び替えしたいのですが・・・

    PHP4 MySQL4 経験値1ヶ月くらいのビギナーです。 PHP+MySQLで会員DBを構築し、やっと検索をかけて思惑の通り一覧が表示されるようになり感激していたのもつかの間・・・ この1週間『並び替え』という新たな壁にぶつかり身もだえしております。 ベテランの皆さま!どうか!どうか、お知恵を!救いの手をお貸しくださいませ!! 【 現状です 】 ■会員テーブル:member ■id:int ■name:vachar ■age:int ■addr:varchar レコード数200くらい 【 したいこと 】 例えば年齢を20~30で検索します。 50くらいのレコードが絞られて表示されます。 このときはidの順番に一旦並んでいます。 それから年齢の若い順、高齢の順に並び替えたいのですが・・・どうしたいいでしょうか? 【 やってみたこと 】 プルダウンを設置して、javascriptで選択した時点でURLを移動させて(違うファイルではなくそのファイルに)その際、GETで数値を持っていってもらって おんなじファイル(一覧表示のPHPファイル)にリンクさせて、そのGET値を受け取って、反映して・・・と文章にすると良くわからんことを思いついてして 見ました。 全てのレコードが表示されているときはうまく行きました・・・が、検索した結果の状態で並び替えると、検索した結果の50件の中での並び替えが できず、並び替えを実行すると全てのレコードが表示されてしまいます。 検索して、「絞り込まれた状態(ここでは50件のこと)」でそのレコードたちだけを並び替えさせたいのです。 【 こんなコードなんです 】 一覧表示のPHPファイル:ichiran.php <? $db = mysql_connect("localhost","××××","××××"); mysql_select_db("member"); $query = "SET NAMES utf8"; // 検索ページから年齢の下限を取得 $low_age= $_POST["low_age"]; // 検索ページから年齢の上限を取得 $high_age= $_POST["high_age"]; // 並び替えの時、 $order_age= $_GET["order_age"]; // 取得した検索結果からSQL文に変換(下限) if($low_age != ""){ $where_low_age = "age >= '$low_age'"; } else { $where_low_age = ""; } // 取得した検索結果からSQL文に変換(上限) if($high_age != ""){ $where_high_age = "age <= '$high_age'"; } else { $where_high_age = ""; // 取得した並び替えGETをSQL文に変換 switch ($order_age){ case 1: $sql_order = " order by age "; break; case 2: $sql_order = " order by age desc ; break; default: $sql_order = " order by id "; } // SQL文に変換 $query = "select * from member where ".$where_low_age." and ".$where_high_age.$sql_order; $result = mysql_query($query); </html> <body> <head> <!-- 並び替え --> <script type="text/javascript"> function change(myURI){ if(myURI !="default"){ window.document.location.href=myURI; } } </script> <!-- 並び替え --> </head> <!-- 一覧表示 --> while( $row = mysql_fetch_array($result) ) { echo $row["age"]."<br>"; } <!-- 並び替え実行部分 --> <form name="sampleForm1" id="sampleForm1"> <select name="selectMenu1" id="selectMenu1" onchange="change(this.form.selectMenu1.value);"> <option value="default" selected="selected">年齢並び替え</option> <option value="ichiran.php?order_age=1">若い順</option> <option value="ichiran.php?order_age=2">高齢の順</option> </select> </form> </body> </html> <? mysql_close($db); ?> 分かりにくい説明ですが、どうぞどうぞ皆さまよろしくお願い致します!!

    • ベストアンサー
    • PHP

専門家に質問してみよう