2016-05-14 31 views
0

我試圖用數與圖像的所有答覆:
<%= Reply.where(:post_id => post.id).where(:reply_file_fingerprint => true).count %>計數有兩個在那裏返回0

但是這回0

我怎樣才能正確計算包含的回覆數量圖片?

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

回答

1

你沒告訴我們您的列reply_file_fingerprint是什麼,但名稱聽起來像是而不是一個布爾值。您向數據庫詢問行的值「t」,並且可能只有沒有值爲「t」的行。所以數據庫正確返回「0」。

如果您的指紋是同一種哈希和的,它是NULL時沒有圖像,這你可以得到圖像的所有答覆是這樣的:

Reply.where(:post_id => post.id). 
    where('reply_file_fingerprint IS NOT NULL').count 

要使用協會,如「最大」建議應給你明確要求post_id的結果。

+0

在最近的Rails版本中,where.not(reply_file_fingerprint:nil).count –

0

添加兩個過濾器在單一.where(),但是這是同樣的事情,你做了什麼。

<%= Reply.where(:post_id => post.id, :reply_file_fingerprint => true).count %> 

這將產生一個像這樣的SQL:

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

我猜你只是沒有Reply s的指紋特定的帖子ID。

+0

我確信,有指紋4頁有關的答覆。 – aidiah

1

使用關聯盧克!

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 %> 
+0

還要確保'reply_file_fingerprint'是一個布爾列! – max

+0

已經有關聯,你的第一個返回0,第二個如何工作 – aidiah

+0

這很奇怪。 – max

0

如果你想一次算兩個條件:

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

這將使用一個單一的查詢,其中的關鍵是reply_file_fingerprint發現的值返回一個散列,和值出現的次數。

例如

{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