Ruby on Rails中数据库调用的两个条件

时间:2015-03-12 19:41:20

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

我有一个Ruby on Rails应用程序,其中包含帖子类别

在索引视图中,它应显示每个类别的帖子列表,其中包含两个条件:

  • 类别有一些帖子
  • 帖子不超过30天

我怎样才能在我的控制器中包含第二个条件?

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])  }

2 个答案:

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