代码之家  ›  专栏  ›  技术社区  ›  Brian

ROR前五名

  •  0
  • Brian  · 技术社区  · 14 年前

    我有一个模型,里面有一个职位的评级。

    我想显示一个给定帖子的前5个评分列表,但是我完全不知道从哪里开始。我认为查找方法可能有一些有用的东西,但我不确定。我甚至考虑过在每个记录中循环获取其大小、将其添加到哈希、对哈希进行排序等,但这似乎太复杂了。

    有人知道我怎样才能完成这样的事情吗?

    谢谢你

    编辑:我发现这是为了让所有评分为“同意”的帖子:

    Post.find(:all, :include => :post_ratings, :condtions => ['post_ratings.agree = ?', true])
    

    唯一的问题是我不知道如何从这个查询中获得前五名的评分。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Shadwell    14 年前

    对于您正在使用的代码,也许值得再举一个例子,但我将用一些假设来回答。

    如果你有:

    class Post
      has_many :post_ratings
    end
    
    class PostRating
      belongs_to :post
    
      # Has a 'rating' attribute
    end
    

    您可以通过以下方式找到排名前五的帖子:

    p = Post.find(:first) # For example
    p.post_ratings.find(:all, :limit => 5, :order => 'rating desc')
    

    要获得整体前五名的排名,您可以:

    PostRating.find(:all, :limit => 5, :order => 'rating desc')
    

    更新:

    编辑之后,您似乎有一个“同意”和一个“不同意”栏。不知道如何结合使用,所以我将坚持“同意”列。您需要做的是统计带有同意标记的评分。类似:

    count_hsh PostRating.count(:group => 'post_id', 
                               :order => 'count(*) desc', 
                               :conditions => { :agree => true },
                               :limit => 5)
    

    这将返回一个哈希,将post-id映射到agree-ratings的计数。然后,您可以使用该帖子ID来定位帖子本身。评级是由计数提供的,因此个别评级(我认为)是没有用的,尽管你可以通过拨打post.post_ratings访问它们。

    因此,要获得前五个职位:

    @top_five_posts = []
    count_hsh.each_pair do |post_id, ratings|
      p = Post.find(post_id)
      p[:rating_count] = ratings
      @top_five_posts << p
    end
    

    这可能比它可能更详细,但希望是说明性的。这个 p[:rating_count] 是一个虚拟属性,它不在数据库中,但允许您访问 .rating_count 方法,如果您希望的话。

        2
  •  0
  •   marshally    14 年前

    假设与shadwell答案相同的帖子和帖子:

    class Post
      has_many :post_ratings
    end
    
    class PostRating
      belongs_to :post
    
      # Has a 'rating' attribute
    end
    

    要获得所有职位的前五个评分:

    post_ratings.find(:all, :limit => 5, :order => 'rating desc')
    

    要获得特定职位的前五个评级,您可以:

    p = Post.find(:first)
    post_ratings.find_all_by_post_id(p.id, :limit => 5, :order => 'rating desc')
    

    要查找按平均评分排序的所有文章,可以使用ActiveRecord::Calculations。

    PostRating.average(:rating, :group => :post_id, :include => :post, :order => 'average desc')