2011-12-06 9 views
1

私は2つのモデルを持っています:グループ&グループメンバーネストされたモデルの数に基づいて並べ替えるRailsクエリ?

私はグループを返します。最高のGroupMember Countでソートしますか?このタイプの結合/クエリの数をRailsでどのように設定しますか?唯一のグループテーブルの上に、

$ rails g migration add_group_member_counts_to_groups 

# migration 
def change 
    add_column :groups, :group_members_count, :integer, default: 0 
end 

class GroupMember < ActiveRecord::Base 
    belongs_to :group, counter_cache: true 
end 

class Group < ActiveRecord::Base 
    has_many :group_members 
    scope :order_by_group_members_count, order('group_members_count DESC') 
end 

Group.order_by_group_members_count # => What you're looking for 

つだけのクエリ:

+0

誰か他のアイデア? – AnApprentice

答えて

2

人生はそんなに簡単counter_cacheです。

編集

あなたがgroup_members_countをリセットする必要がある場合:

ids = Group.select(:id).map &:id 
ids.each do |id| 
    Group.reset_counters(id, :group_members) 
end 

(reset_countersは、IDの配列をとらないので)

将来Rails 3.2.0で、あなたは書きます:

ids = Group.pluck(:id) 

私は、これは、多くのグループレコードと有意なSQLの減速を生成することがありましたご注文句内のサブクエリを作成することを;-)

+0

ありがとうございますが、今はいろいろな理由でこれを避けたいと思います。これはどのようにRailsで行うことができますか?有用なreset_countersコードのためにありがとう – AnApprentice

+0

+1 - また、 "プルク"について知りませんでした - 素晴らしい。 –

0
class Group < ActiveRecord::Base 
    has_many :group_members 

    default_scope order('(select count(1) from group_members where group_members.group_id = groups.id) desc') 
end 

注意を待つことができません。この情報が頻繁に使用される場合は、Delbaが示唆するようにカウンタキャッシュを持つ方が良いかもしれません。

関連する問題