Rails соединяются и фильтруются по основным идентификаторам моделей - PullRequest
0 голосов
/ 01 марта 2019

Почему эти два запроса дают разные результаты?

FbGroup.where('fb_groups.id IN (?)', ids).length
> 300

FbGroup.joins(:fb_posts).where('fb_groups.id IN (?)', ids).length
> 500

Мой желаемый результат - присоединиться к fb_posts, но прежде чем присоединиться, я бы хотел отфильтровать fb_groups по определенным идентификаторам.Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Мой желаемый результат - присоединиться к fb_posts, но прежде чем присоединиться, я бы хотел отфильтровать fb_groups по определенным идентификаторам.Как я могу это сделать?

Я использовал fb_groups с id 1, 2 и 3 только для примера

FbGroup.where(id: [1, 2, 3]).joins(:fb_posts).count
0 голосов
/ 01 марта 2019

Я думаю, что это дублирование записей в объединениях.Вы должны использовать group_by с соединениями, чтобы устранить это.Попробуйте,

FbGroup.joins(:fb_posts).where('fb_groups.id IN (?)', ids).group('fb_groups.id').length

Пожалуйста, исправьте, если я ошибаюсь.

0 голосов
/ 01 марта 2019

Почему эти два запроса приводят к разным результатам?

Объединение может привести к записи 1: N (один ко многим).Например.если у одного FbGroup есть два FbPost, вы получите две записи при присоединении.

Мой желаемый результат - присоединиться к fb_posts, но прежде чем присоединиться, я бы хотел отфильтровать fb_groups по определенным идентификаторам.,Как я могу это сделать?

Ваш второй запрос уже делает это.Когда вы фильтруете с помощью объединения или объединения, а затем фильтруете во внешнем запросе, вы все равно получите те же результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...