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

时间:2014-01-31 04:21:56

标签: ruby-on-rails ruby activerecord ruby-on-rails-4 where

我正在使用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 []>

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

2 个答案:

答案 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