根据具有特定条件的相关模型的数量选择模型

时间:2018-06-01 12:37:10

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

我有一个Post has_many :comments。假设Comment包含以下字段:another_model_id。我想选择帖子,其中包含another_model_id = 10的2到5条评论(例如)。我尝试了几种结构但没有成功:(

我尝试过的例子:

# Invalid SQL syntax error
Post
  .joins(:comments)
  .select("count(comment.another_model_id = 10) as comments_count)
  .where("comments_count BETWEEN 2 AND 5")

我真的不知道在哪里挖。是否有可能在单个查询中实现?谢谢!

2 个答案:

答案 0 :(得分:1)

Post
  .joins(:comments)
  .where(comments: { another_model_id: 10 })
  .group('posts.id')
  .having('count(comments.id) > 2 AND count(comments.id) < 5')

答案 1 :(得分:0)

使用counter_cache是您的方案的最佳做法:

Comment模型中,您需要设置counter_cache

belongs_to :post, counter_cache: true

然后,您只需使用此查询:

Post.joins(:comments)
    .where(comments: { another_model_id: 10 })
    .where('comments_count > ? AND comments_count < ?', 2, 5)