Получить запись хотя бы с одним связанным объектом
У меня есть следующая схема в mongoid:
У пользователя много задач - has_many:tasks
Задача принадлежит пользователю - assign_to:user
Как я могу получить только 10 первых пользователей хотя бы с одной задачей?
Что-то вроде этого:
User.where(:tasks.ne => [] ).limit(10)
2 ответа
Ваша проблема в том, что Mongoid has_many
ничего не оставляет в родительском документе, поэтому в родительском документе нет запросов, которые могли бы сделать что-то полезное для вас. Тем не менее belongs_to :user
в вашем Task
добавит :user_id
поле к tasks
коллекция. Это оставляет вас с такими ужасными вещами:
user_ids = Task.all.distinct(:user_id)
users = User.where(:id => user_ids).limit(10)
Конечно, если бы вы имели embeds_many :tasks
вместо has_many :tasks
тогда вы могли бы запросить :tasks
внутри users
Коллекция, как вы хотите. ОТО, это, вероятно, сломало бы другие вещи.
Если вам нужно разделить задачи (т.е. не внедрять), вы можете настроить счетчик в User
чтобы отслеживать количество задач, а затем вы можете сказать, что-то вроде:
User.where(:num_tasks.gt => 0).limit(10)
Ты можешь сделать
User.where(:tasks.exists => true).limit(10)
Обновить:
Работал на меня, когда делал:
u = User.new
t = u.tasks.build
t.save
u.save
u = User.new
u.save
User.where(:tasks.exists => true).limit(10).count
=> 1