数为2,返回0

时间:2016-05-14 16:22:49

标签: ruby-on-rails ruby

我正在尝试用图像计算所有回复:
<%= Reply.where(:post_id => post.id).where(:reply_file_fingerprint => true).count %>

但是这会返回0

如何正确计算包含图片的回复数量?

日志:
SELECT COUNT(*) FROM "replies" WHERE "replies"."post_id" = 1 AND "replies"."reply_file_fingerprint" = 't'

4 个答案:

答案 0 :(得分:1)

使用关联Luke!

class Post < ActiveRecord::Base
  has_many :replies
end

class Reply < ActiveRecord::Base
  belongs_to :post
end

这将让我们这样做:

post.replies.where(reply_file_fingerprint: true).count

然而,这会导致所谓的N + 1查询,因为每个帖子都会在回复表上引起COUNT个查询。

相反,您可能需要提前加载

@posts = Post.eager_load(:replies)
             .where(replies: { reply_file_fingerprint: true })

而不是.count使用更智能的.size

<% @posts.each do |post| %>
  <%= post.replies.size %>
<% end %>

答案 1 :(得分:1)

您没有告诉我们您的列<a href="#" id="verify">{{userInformation.value === true ? displaysomething : displaysomethingelse}}</a> 是什么,但名称听起来像是而不是布尔值。您向数据库询问值“t”的行,并且可能没有值为“t”的行。所以数据库正确返回“0”。

如果您的指纹是相同类型的hashsum,并且在没有图像时为NULL,则可以使用以下图像获取所有回复:

reply_file_fingerprint

使用像“max”建议这样的关联应该给你与明确询问Reply.where(:post_id => post.id). where('reply_file_fingerprint IS NOT NULL').count 相同的结果。

答案 2 :(得分:0)

在一个<%= Reply.where(:post_id => post.id, :reply_file_fingerprint => true).count %> 中添加两个过滤器,但这与您所做的相同。

SELECT COUNT(*)
  FROM "replies"
  WHERE "replies"."post_id" = ? AND
     "replies"."reply_file_fingerprint" = ?  [["post_id", 123], ["reply_file_fingerprint", "t"]]

这将生成如下的SQL:

Reply

我猜你不会{{1}}为该特定帖子ID提供指纹。

答案 3 :(得分:0)

如果您想同时计算两个条件:

Reply.where(:post_id => post.id).group(:reply_file_fingerprint).count

这将使用单个查询返回哈希,其中键是找到的reply_file_fingerprint的值,值是出现次数。

e.g。

{true => 4, false => 1}
{true => 4}
{false => 1}
{}

所以:

found_hsh = Reply.where(:post_id => post.id).group(:reply_file_fingerprint).count
trues  = found_hsh[true ] || 0
falses = found_hsh[false] || 0