Как выбрать uniq child от родителя в ActiveRecord в одном запросе? - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть модал с именем User

class User < ActiveRecord::Base
   has_many: :posts
end

и другой модал с именем Post

class Post < ActiveRecord::Base
   belongs_to :user
end

, если у меня есть объект сообщений с ограничением (скажем, posts = Post.where(id: [1,2,3,4])

как я могу запросить уникальных пользователей всех сообщений, используя активные методы записи

я знаю, что это можно сделать в двух запросах, есть ли способ сделать это в одном запросе?

Ответы [ 4 ]

2 голосов
/ 24 сентября 2019

Попробуйте, как указано в документах :

User.joins(:posts).where(posts: {id: [1,2,3,4]})

Или, если у вас уже есть экземпляр с именем posts:

User.joins(:posts).where(posts: {id: posts})
0 голосов
/ 24 сентября 2019

1 запрос с некоторой обработкой в ​​ruby ​​

Post.eager_load(:user).where(id: [1,2,3,4]).map(&:user)
0 голосов
/ 24 сентября 2019

Вы можете использовать один запрос, подумав, как работает внутреннее соединение.Если вы используете User.joins(:posts), это выполнит внутреннее объединение и вернет только пользователей с хотя бы 1 сообщением.Кроме того, вы хотите фильтровать эти сообщения, и вы можете сделать это, используя метод merge в ActiveRecord.Результат будет:

User.joins(:posts).merge(Post.where(id: [1,2,3,4]))

Это создаст один SQL-запрос

0 голосов
/ 24 сентября 2019

User.where id: posts.distinct.select(:user_id)

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