【问题标题】:Count value of records which belong to other model in railsrails中属于其他模型的记录的计数值
【发布时间】:2009-08-20 00:18:13
【问题描述】:

这可能是非常基本的,但我试图弄清楚如何在我的应用程序的帖子索引页面上显示一个帖子在 rails 中有多少 cmets。

cmets belongs_to 发布,并且发布 has_many cmets

只是不确定如何在索引页面上显示每个帖子的 cmets 数量。

提前致谢!

艾略特

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    试试这个。

    <%= post.comments.size %>
    

    您可能还对pluralize 方法感兴趣。

    <%= pluralize(post.comments.size, 'comment') %>
    

    这将输出“3 cmets”或“1 comment”等。

    【讨论】:

    • 非常感谢!像魅力一样工作!
    • post.cmets.size 的查询时间会比 post.cmets.count(:all) 长,见下文。
    • @klochner,是一样的。 "count" 和 "size" 都将使用 count(*) 查询 has_many 关联。
    【解决方案2】:

    我在这里可能错了,但你应该使用

    &lt;%= post.comments.count %&gt; 而不是size

    ActiveRecord 知道 'count' 是一种特殊方法,并将其转换为 SELECT count(id) from comments where post_id = x(这是您想要的)。

    size 然而,这不是一个特殊的方法,ActiveRecord 会将所有 cmets 加载到内存中的一个数组中(SELECT * from comments where post_id = x,然后告诉你这个数组有多长,这可能是不必要的 - 如果你是将循环遍历页面下方的 cmets 数组,然后您可能希望使用 size 将它们加载到内存中,因为无论如何它都需要稍后发生。

    【讨论】:

    • size 也将使用 COUNT(至少在我刚测试时是这样)
    • 我刚刚测试了它,size 使用了 select ,而 count 使用了 select count()。这可能取决于关系 - 我的是 habtm。
    • 我更喜欢在 has_many 关联中始终使用“size”。我知道在 Rails 2.1 中,如果存在计数器缓存,“count”方法就不会利用它。这可能在 2.3 中发生了变化。
    【解决方案3】:

    您还应该在此处使用一些 ActiveRecord 的内置功能。 counter_cache。看看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多