Выберите модель на основе количества связанных моделей с определенными условиями - PullRequest
0 голосов
/ 01 июня 2018

У меня есть Post, что has_many :comments.Допустим, Comment имеет следующее поле: another_model_id.Я хотел бы выбрать сообщения, которые имеют от 2 до 5 комментариев с another_model_id = 10 (например).Я пробовал несколько конструкций, но безуспешно: (

Пример того, что я пробовал:

# 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 голосов
/ 02 июня 2018

Использование 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)
0 голосов
/ 01 июня 2018
Post
  .joins(:comments)
  .where(comments: { another_model_id: 10 })
  .group('posts.id')
  .having('count(comments.id) > 2 AND count(comments.id) < 5')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...