2014-01-31 48 views
1

我正在使用Rails 4,並且希望獲得給定帖子的每個單獨的帖子評論的投票數。通過向下鑽取關係獲取計數

模式:

Post PostReview PostReviewVote 
id  post_id  post_review_id 
     user_id  user_id 
         voted_on_date 

我有類似:

table.table.table-striped.table-hover 
    thead 
    tr 
     th Post Name 
     th Reviews Created For Post 
     th Total Votes in All Reviews For Post 
    tbody 
    - for post in @posts 
     tr 
     td= post.name 
     td= PostReview.where(post_id: post.id).size 
     td= PostReview.where(post_id: post.id).PostReviewVotes.size 

但它不取,理由是運行時錯誤:

undefined method `PostReviewVotes' for #<ActiveRecord::Relation []> 

有什麼建議?我的模型具有適當的關聯,僅供參考。

+0

你說他們有適當的關聯。 「Post」是否具有關聯:'has_many:PostReviewVotes,through:PostReview'? – Beartech

回答

1

你可以簡單地這樣做:

post.post_reviews.count 
post.post_review_votes.count 

如果你有定義的所有團體照你說的。

,或者如果你想爲它的方法...

在發表你的模型:

def post_votes_total 
    self.post_review_votes.count 
end 

只要你定義在帖子的關係:

has_many :post_review_votes, through: :post_reviews 

由於您正在將@posts變量傳遞給視圖:

post.post_votes_total 

在視圖中使用內置關聯方法很好,但如果邏輯變得更復雜,您應該真的使用模型方法或輔助方法。

0

問題的夫婦我看到:

PostReview.where(post_id: post.id)可以返回多個記錄。

你們的關係應該定義爲post_review_votes,所以你要調用.post_review_votes而非PostReviewvotes

您可能需要執行下列操作之一: `PostReview.where(post_id: post.id).first.post_review_votes.size - 如果你只希望一個PostReview這可能是你想要什麼。

PostReview.where(post_id: post.id).collect{|pr| pr.post_review_votes.size}.sum - 這將採取所有的後評論,得到他們的票數的大小,並將它們加在一起。

或純SQL:

PostReviewVotes.includes(:post_review).where("post_reviews.post_id: ?", post.id).count

+1

我想他希望在該專欄中列出「PostReview.where(post_id:post.id)」的數量,這就是爲什麼他會計算它返回的數字。 – Beartech

+0

@Beartech:沒錯。至於'.collect {}'是否真的是最好的方法呢?似乎令人費解。 – sergserg

+0

@Serg可能存在一個ActiveRecord查詢,它將更乾淨地生成此和。 – GeekOnCoffee