2011-01-05 8 views
1

Product次の属性があります。 Rails:製品をフィルタリングして並べ替えるには?

Model

  • ショップ
  • モデル
  • 価格が属する:

    • ブランド
    考える

    、のように:

    Shop Brand Model Price 
    ---- ----- ----- ----- 
    Ebay Sony  S-100 500 
    Ebay Sony  S-200 1000  (in Target it's cheaper) 
    Ebay Dell  D-55  300 
    Target Sony  S-100 600   (in Ebay it's cheaper) 
    Target Sony  S-200 900 
    Amazon Dell  D-33  100 
    

    私はつまり、私が得ることを期待し、最低価格でのみをフィルタリングしたいと思います:

    Shop Brand Model Price 
    ---- ----- ----- ----- 
    Ebay Sony  S-100 500 
    Ebay Dell  D-55  300 
    Target Sony  S-200 900 
    Amazon Dell  D-33  100 
    

    、好ましくModelによって、その後Brandでソートとします:

    Shop Brand Model Price 
    ---- ----- ----- ----- 
    Ebay Sony  S-100 500 
    Target Sony  S-200 900 
    Amazon Dell  D-33  100 
    Ebay Dell  D-55  300 
    

    どうすればいいですか?

答えて

0

データベース固有の並べ替えに満足できますか?

@products.order('brand_id, price') 

EDIT:フィルタと順序

EDIT2:ブランドのソート最初にして

EDIT4モデル:

がEDIT3モデルによる未指数が、グループのスコープがありますまでいけない停止改善のために。

def lowest_priced(products) 
    # All products are grouped by the model (key is model, value is array of products belonging to that model) 
    per_model = products.group_by{|x|x.model} 
    # Hash of lowest products per model 
    lowest = {} 
    per_model.keys.each do |model| 
    # Find lowest priced product for the model 
    lowest[model] = per_model[model].min_by{|p| p.price} 
    end 
    # Sort the values of the hash 
    return lowest.values.sort_by{|p| [p.model.brand,p.model]} 
end 

以上のコードを理想的にリファクタリングすると、各機能には1つの責任しか持たないようになります。

+0

フィルタリングする必要がありますか? –

+0

aah!だから、あなたはmodel_idでグループ化し、最低価格を選んでソートする必要があります。あなたはファンキーなクエリでデータベース内でこれを行うことができますが、ポータブルであろうとなかろうと、それはうんざりです。私は私の答えをルビーの解決策で更新します(これはすべてのレコードが取り出されることを意味していることに気をつけてください)。 –

+0

すべてのレコードを選択し、これらのすべての列挙可能なメソッドを使用すると、大量のデータで非常に遅くなり、不必要な複雑さを招きます。少量のデータしか取り扱っていないことが分かっていない限り、私はこの手法を絶対に避けたいと思います。 – idlefingers

0

searchlogic gemを使用してください。それは検索と順序付けのための多くのスコープを生成します。例えば

Product.search(:order => :ascend_by_model) 
+0

searchlogicはRails 3でかなりうまく動作していませんし、しばらく維持・更新されていません。 –

0

あなたは、モデルとしたいために戻ってきて発注につき1件の結果を得るだけに、グループ化、テーブルを結合して単一のクエリでこれを行うことができるはずです。以下は、あなたが必要なものの線に沿って次のようになります。

Product.joins(:model => :brand).group("models.name").order("products.price, brands.name, models.name") 

私は推測してきたモデルとブランドのテーブルモデル名およびブランド名は、に格納されているものである、列名か何かと呼ばれる

を持っています。
関連する問題