【问题标题】:rails sorting blog posts by titlerails 按标题排序博客文章
【发布时间】:2011-08-03 01:15:49
【问题描述】:

我意识到这可能是一种罕见的情况(两个或多个用户会有相同的博客文章标题)但这是我的客户想要的,所以我必须弄清楚。

我有一个查询@blog_posts(这是一个根据位置等更改的帖子查询)。我需要一种方法来列出所有帖子标题以及该标题在查询中出现的次数@blog_posts

像这样:

How to clean a car (2)
I love baseball (1)

是否有分组和排序的标准做法?

总而言之,我需要统计查询中出现的次数 @blog_posts = Post.where(...) (例如)——并非所有帖子都存在。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    是的,您可以在模型中使用命名范围(rails 3+ 语法):

    scope :title_count, select('id, title, count(*) AS tcount').
        where('created_at >= ?', 10.days.ago).
        group('id, title').
        order('tcount desc')
    

    在您的控制器中:

    @posts = Post.title_count
    

    【讨论】:

    • 这是对所有帖子的查询。我需要它只在查询@blog_posts = Post.where(...) 中选择的帖子上执行,而不是整个数据库中的所有帖子。
    • @masedesign - 这很简单,只需在组行前添加where('...').。范围只是将所有这些不同的查询操作链接在一起。
    【解决方案2】:

    听起来您基本上想计算出现次数:this answer 可以适应您的目的。

    如果您使用的是 1.8.7 或更高版本,请考虑使用group_by

    ruby-1.9.2-p180 :002 > posts = ["How to clean a car", "How to clean a car", "I love baseball"]
     => ["How to clean a car", "How to clean a car", "I love baseball"]
    ruby-1.9.2-p180 :007 > posts.group_by {|e| e}.map {|k, v| {k => v.length}}
     => [{"How to clean a car"=>2}, {"I love baseball"=>1}] 
    

    【讨论】:

    • 谢谢 - 我需要以某种方式访问​​视图中的标题、计数和帖子 ID。
    • 我需要统计查询 @blog_posts = Post.where(...) 中出现的次数——并非所有帖子都存在。
    • 可能类似于@blog_posts.group_by {|post| post.title}.map {|k, v| {k => v.length}}
    • 那行得通,任何关于如何让我的视图显示的建议:post.title (post.count) - 现在他们的打印都像:Title2Title5Title8
    • 对不起,我的原始代码有点草率。这样的东西会更合适:@blog_posts.group_by {|post| post.title}.each {|title, posts| puts "#{title} (#{posts.count})"}
    【解决方案3】:

    这样的?

    @blog_post_counts = Post.find(
      :all, 
      :select => "COUNT(*) AS count, title", 
      :group  => "title", 
      :order  => "count DESC"
    )
    

    当然,您需要修改查询,以便包含您的条件等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 2017-09-26
      • 2015-10-05
      • 2019-01-13
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多