Rails has_many,根据关联的数量排序!

stephen · 2012年01月09日 · 最后由 Rei 回复于 2012年02月04日 · 4253 次阅读

作者对象 has_many 文章, 根据发布文章的多少对作者进行排序, 实现好似简单, 而在 rails 中,有什么的好的写法?

楼主自己的想法是?

将 articles_count 作 count_cache,加上数据库索引,并以此排序。

我这个办法有没有问题?我以前就是这么用的。。

Author.joins(:articles).select("count(articles.id) as article_count").group("authors.id").order("article_count")

2 楼的办法还没见过。。一会儿研究一下

@Rei 就是实现一个文章发表排行榜!以数量为排名参考!

@ashchan 求代码!有点模糊

@cqpx 参考中!!!谢谢!!!

class Post
  include Mongoid::Document

  belongs_to :user, :counter_cache => true
end

class User
  include Mongoid::Document

  field :posts_count, :type => Integer
  has_many :posts

  index :posts_count

  # 文章多的用户倒序排列
  scope :hot, desc(:posts_count)
end
@hot_users = User.hot.limit(10)

这是 Mongoid 的写法,ActiveRecord 类似,转换一下就好了。

#7 楼 @huacnlee 应该让 LZ 先贴自己的实现嘛

@huacnlee 谢谢,@Rei 其实我的实现和@cqpx的差不多!但是我觉得 rails 应该有更好的实现方法,所以提问了!

#9 楼 @stephen 我那个方法就是正确的途径 #8 楼 @Rei ^_^

@huacnlee field :post_count, :type => Integer 这里不属于 activerecord>??

#11 楼 @stephen 这个是 Mongoid 的实现,ActiveRecord 不用在 Model 设置 field,不过要迁移。根据这个思想改造一下好了。

@Rei 意思就是说,在 user 的数据表中建立一个字段 posts_count,@huacnlee 把这个字段名起 posts_count 是有原因的,就是让 rails 自动关联到这个字段。

@Rei @huacnlee 等我学习下 counter_cache 的资料先

#13 楼 @stephen 是的,xxx_count 是个魔法字段

@huacnlee @Rei scope :hot, desc(:posts_count) 这个方法 desc????

需要 登录 后方可回复, 如果你还没有账号请 注册新账号