我正在尝试用图像计算所有回复:
<%= 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'
答案 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