Rails has_many总和并计入ActiveRecord

时间:2015-12-30 04:31:00

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个两难的境地,我想我可能已将自己编入角落了。这是设置。

我的网站有用户。每个用户都有他们发布的故事集。每个故事都有其他用户的评论集。

我想在用户页面上显示其他用户的评论总数。

所以用户有很多故事,故事有很多评论。

我尝试的是在@stories中加载所有用户的故事然后显示@ stories.comments.count,但是当我尝试这样做时,我得到了未定义的方法'comments'。有没有一种有效的ActiveRecord方法来做到这一点?

3 个答案:

答案 0 :(得分:2)

class User < ActiveRecord::Base
  has_many :stories
  has_many :comments, through: :stories
end

class Story < ActiveRecord::Base
  belongs_to :user
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :story
end

现在你应该能够获得User.last.comments.count

我认为你需要更多地改进它以获得适当的标签。

答案 1 :(得分:0)

在你的控制器中你应该有这样的东西(注意使用includes):

@user = User.find( params[:id] )
@stories = @user.stories.includes(:comments)

然后在您的视图中,您可以执行以下操作,以显示该特定用户的评论总数:

Total number of comments: <%= @stories.map{|story| story.comments.length}.sum %>

答案 2 :(得分:0)

快速解决方案是迭代@stories集合并添加计数。但这不是一个纯粹的活跃记录解决方案。

totalComments = 0
@stories.each do |story|
    totalComments += story.count
end

对于纯粹的活动记录解决方案,我需要假设每个has_many关联都有一个相应的belongs_to关联。因此,用户拥有故事和故事属于用户。如果是这种情况并且评论与故事具有类似的关联,那么您可以按user_id搜索评论。类似的东西:

Comments.where("comment.story.user" => "userId")

我希望有所帮助。