2009-07-19 17 views
1

私はモデルがCategoryであると仮定します。has_manyItemsです。今、私はの表を提示したいと思います。のさまざまな属性でソートされました。商品番号です。たとえば、最も高い価格の項目を含むカテゴリを上部に表示します。または、最高の定格項目に基づいてカテゴリをソートします。または、最新のアイテムに基づいてカテゴリをソートする(すなわち、最新のアイテムを含むカテゴリが最初になる)。ActiveRecordモデルをサブモデル属性でソートする?

class Category < ActiveRecord::Base 
    has_many :items 

    # attributes: name 
end 

class Item < ActiveRecord::Base 
    belongs_to :category 

    # attributes: price, rating, date, 
end 

どのアプローチが最適ですか?

  1. ソート用の属性(最高の商品価格またはそのカテゴリ内のアイテムの最高の評価)を保持するために、カテゴリモデルに追加の列を維持します。私は以前これをやったことがありますが、ちょっと醜いですし、アイテムが変わるたびにカテゴリモデルを更新する必要があります。
  2. 注文句にはいくつかの魔法のSQL呪文がありますか?
  3. 他に何かありますか?

私が思いつくのは、含まれているアイテムの最大価格でソートされたカテゴリのリストを作成するためのSQLです。

select categories.name, max(items.price) from categories join items group by categories.name 

これがどのようにRailsコードに変換されるのかよくわかりません。このSQLは、カテゴリーを最新のアイテムの価格でソートしたければ機能しません。私は実際に明らかなパフォーマンス上の理由からこれをデータベースに保存しようとしています。

答えて

0

そうではありません:結合は何ですか?

Category.find(:all, :joins => :items, :order => 'price') 

Category.find(:all, :joins => :items, :order => 'rating') 
+0

これは正しい方向に向いていますが、私は単純な結合以上のものが必要です。私の部分的な解決策は上記ですが、私は柔軟性が必要であり、Railsコードについてはわかりません。 – ideasasylum

3

アイテムモデルにリストされている属性がデータベース列であるとすると、実行できることはたくさんあります。

最も簡単にはおそらくnamed_scopesさ

/app/models/category.rbその後

class Category < ActiveRecord::Base 
    has_many :items 

    # attributes: name 
    named_scope :sorted_by_price, :joins => :items, :group => 'users.id', :order => "items.price DESC"  
    named_scope :sorted_by_rating, :joins => :items, :group => 'users.id', :order => "items.rating DESC" 

    named_scope :active, :condition => {:active => true} 


end 

あなただけに最高、価格でソートされたカテゴリのリストを返すためにCategory.sorted_by_priceを使用することができます最低。 named_scopesの利点は、複数の同様のクエリを連鎖させることができます。上記のコードを使用して、カテゴリーにactiveという名前のブール値がある場合。最も高価なアイテムで注文されたアクティブなカテゴリのリストを取得するには、 Category.active.sorted_by_priceを使用できます。

関連する問題