2015-10-10 19 views
1

我想要映射記錄並按散列結果對它們進行排序,該散列計算另一個模型中具有'belongs_to'關聯的記錄數第一。如何在'belongs_to'關係中按分組散列的結果排序記錄

tag_follow.rb

belongs_to :tag 
belongs_to :user 

我有一個模型tag.rb以下方法

def self.follow_counts(user) 
    counts = TagFollow.group(:tag_id).count 

    Tag.order(:tag).map{|t| 
    t.followed_count = counts[t.id].to_i 
    t 
    } 
end 

def followed_count 
    @followed_count ||= TagFollow.where(:tag_id => self.id).count 
end 

而是由列:tag訂購標籤陣列,因爲它目前是,我希望按照返回的counts變量的散列值中的計數進行排序,將密鑰與相匹配。

這樣做最簡單的方法是什麼?

回答

1

你可以設置你的標籤模型這樣的命名範圍:

scope :popular, -> { 
    joins(:tag_follows) 
    .group("tags.id") 
    .order("COUNT(*) DESC")  
} 

,然後用它是這樣的:

Tag.popular.all 

把所有的標籤(即至少有1關聯的tag_follows記錄),以它們被引用的記錄數量的順序排列。

如果您希望您的收藏包括標籤有0個屁股ociated tag_follows記錄,讓每一個標籤將集合中,你可以使用一個LEFT JOIN這樣的:

scope :popular, -> { 
    joins("LEFT JOIN tag_follows ON tag_follows.tag_id = tags.id") 
    .group("tags.id") 
    .order("COUNT(tag_follows.tag_id) DESC")  
} 

注意,我改變了order參數,以便與0 tag_follows記錄標籤標籤後會被排在1 tag_follows記錄。

+0

這樣做! +1添加包含0關聯記錄的標籤的解釋,這正是我所需要的。 – alphaleonis