如何通过'belongs_to'关系中的分组哈希结果来记录记录

时间:2015-10-10 23:21:07

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我想映射记录并按散列结果对它们进行排序,该散列计算另一个模型中与第一个模型具有“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变量的哈希值,匹配密钥:tag_id

最简单的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以在Tag模型中设置命名范围,如下所示:

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

然后像这样使用它:

Tag.popular.all

按照引用它们的tag_follows条记录的顺序获取所有标记(至少有一条关联的tag_follows记录)。

如果您希望您的收藏集包含具有0个关联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条记录的代码后排名。