Получить запись хотя бы с одним связанным объектом

У меня есть следующая схема в 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
Другие вопросы по тегам