2011-12-06 49 views

回答

2

生命是如此容易得多counter_cache:

$ 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 

只有一個查詢,僅在組表。

編輯

如果您需要重置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) 

我迫不及待;-)

+0

謝謝,但由於各種原因,我現在想避免這種情況。這怎麼可以用Rails完成?謝謝 – AnApprentice

+0

+1有用的reset_counters代碼 - 也不知道「拔」 - 很好。 –

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 

請注意,這造成您的訂單子句中的子查詢,這可能會產生許多組記錄一個顯著SQL放緩。如果經常使用這些信息,那麼Delba建議使用計數器緩存可能會更好。