我有一个Ruby on Rails应用程序,其中包含帖子和类别。
在索引视图中,它应显示每个类别的帖子列表,其中包含两个条件:
我怎样才能在我的控制器中包含第二个条件?
def index
@categories = Category.includes(:posts).select{|c| c.posts.count > 0}
end
注意: 我尝试了以下内容,但仍显示超过30天的帖子:
@categories = Category.includes(:posts).select{|c| c.posts.count > 0 && c.posts.where(['created_at > ?', 30.days.ago]) }
答案 0 :(得分:3)
您可以执行以下操作:
Category.joins(:posts)
.select('categories.*')
.group('categories.id')
.where('posts.created_at > ?', 30.days.ago)
.having('COUNT(posts.*) > 0')
这将返回:
具有至少1个“最近”帖子的类别,该帖子是/最多30天
从我之前的回答:How to return results filtered on relations count to a view in RAILS?
答案 1 :(得分:1)
使用包含实施的解决方案是:
@categories = Category.includes(:posts).select{|c| c.posts.where(['created_at > ?', 30.days.ago]).count > 0}
MrYoshiji解决方案也可以使用 join 而不是 includes 。
额外:你可以在这个问题中检查一个soluiton在同一逻辑上实现额外条件:
Sort two set of instances based on one of them - Views - Ruby on Rails