Rails has_many sums and counts with ActiveRecord
我陷入了两难境地,我想我可能已经把自己编码到了一个角落里。这是设置。
我的网站有用户。每个用户都有他们发布的故事集合。每个故事都有来自其他用户的评论集合。
我想在用户页面上显示来自其他用户的评论总数。
所以一个用户有_many 个故事,一个故事有_many 个评论。
我尝试的是在@stories 中加载所有用户故事,然后显示@stories.comments.count,但是当我尝试这样做时,我得到了未定义的方法'comments'。有没有一种有效的 ActiveRecord 方法来做到这一点?
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
现在你应该可以得到
我认为您需要进一步完善这一点以获得正确的标签。
快速的解决方案是遍历@stories 集合并添加计数。不过,这不是一个纯粹的主动记录解决方案。
1 2 3 4 | totalComments = 0 @stories.each do |story| totalComments += story.count end |
对于纯活动记录解决方案,我需要假设每个 has_many 关联都有一个对应的 belongs_to 关联。所以一个用户有_许多故事和一个故事属于_一个用户。如果是这种情况并且评论与故事有类似的关联,那么您可以通过 user_id 搜索评论。类似于:
1 | Comments.where("comment.story.user" =>"userId") |
希望对你有帮助。
在你的控制器中你应该有这样的东西(注意使用
1 2 | @user = User.find( params[:id] ) @stories = @user.stories.includes(:comments) |
然后在您的视图中,您可以执行以下操作来显示该特定用户的评论总数:
1 | Total number of comments: <%= @stories.map{|story| story.comments.length}.sum %> |