我想映射记录并按散列结果对它们进行排序,该散列计算另一个模型中与第一个模型具有“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
。
最简单的方法是什么?
答案 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
条记录的代码后排名。