Ruby .each块不会添加所有对象

时间:2011-11-08 19:31:31

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

出于某种原因,似乎.each块只迭代一次,当我写下时可以说3或4条评论,@total_comments只显示1而不是3或4。

关系是:

  • 用户有很多帖子
  • 帖子有很多评论

有人可以帮忙吗?

控制器

@total_comments = 0
@posts = current_user.posts

@posts.each do |post|
@comments = post.comments
@new_comments = @comments.count -@comments.where("created_at < ?",1.day.ago).count
@total_comments += @new_comments
end

视图

<%= @total_comments %>

3 个答案:

答案 0 :(得分:2)

要获得您想要的所有评论的计数

@total_comments = Comment.count(
    :conditions => ["post.user_id = ? and comment.created_at >= ?", 
        current_user.id, 1.day.ago], 
    :include => :post
)

虽然不知道你的数据模型,但很难确切地说出来。

正如@m_x讨论的那样,更整洁,更多的rails-3 / ruby​​ 1.9 esque版本

@total_comments = Comment
                .joins( post:  :user )
                .where( users: {id: current_user.id} )
                .where( "created_at < ?", 1.day.ago )
                .count

答案 1 :(得分:1)

改为使用:

@total_comments = Comment
                    .joins( post:  :user )
                    .where( users: {id: current_user.id} )
                    .where( "comments.created_at < ?", 1.day.ago )
                    .count

修改

我绝对需要一些睡眠。正如@Ryan所指出的那样简单得多:

@total_comments = current_user.comments.where( "created_at < ?", 1.day.ago ).count

...但OP必须将此添加到他的User模型中:

has_many :comments, through: :posts

答案 2 :(得分:0)

看起来你忘了保存评论 - 有些评论没有保存到数据库中,这就是为什么你会丢失一些评论。

此外,您可以使用自动保存选项,每次更改变量时自动保存变量。