我正在使用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 :(得分:1)
你可以这样做:
post.post_reviews.count
post.post_review_votes.count
如果您按照自己的意思定义了所有关联。
或者如果你想要一个方法......
在你的帖子模型中:
def post_votes_total
self.post_review_votes.count
end
只要您在Post中定义了关系:
has_many :post_review_votes, through: :post_reviews
由于您将@posts变量传递给视图:
post.post_votes_total
在视图中使用内置的关联方法很好,但是如果逻辑变得更复杂,你应该使用模型方法或辅助方法。
答案 1 :(得分: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