通过深入了解关系来获得数量

我正在使用Rails 4,我希望获得针对特定post的每个post评论的计票数。

架构:

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 # 

有什么建议? 我的模型有适当的关联,仅供参考。

你可以这样做:

 post.post_reviews.count post.post_review_votes.count 

如果您按照自己的意愿定义了所有关联。

或者如果你想要一个方法…

在你的Post模型中:

 def post_votes_total self.post_review_votes.count end 

只要您在Post中定义了关系:

 has_many :post_review_votes, through: :post_reviews 

由于您将@posts变量传递给视图:

 post.post_votes_total 

在视图中使用内置的关联方法很好,但是如果逻辑变得更复杂,你应该使用模型方法或辅助方法。

我看到几个问题:

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 PostReview.where(post_id: post.id).collect{|pr| pr.post_review_votes.size}.sum – 这将PostReview.where(post_id: post.id).collect{|pr| pr.post_review_votes.size}.sum所有post评论,获得他们的投票大小,并将它们一起添加。

或纯SQL:

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