我有一个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")
我真的不知道在哪里挖。是否有可能在单个查询中实现?谢谢!
答案 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)