У меня есть объект User и объект Alliance, где User has_many: alliances, а Alliance own_to: user.Я хочу получить список пользователей, но исключаю тех пользователей, с которыми у current_user уже есть активный альянс (если у пользователя уже есть альянс, поле: pending будет ложным).
Вот конкретный пример,Предположим, что нашими пользователями являются Джо, Боб и Джилл.Джо и Джилл являются активными союзниками, поэтому в состав Joe.alliances войдут Джилл и Джилл, в альянсы войдет Джо.Мне нужен список всех пользователей, которые исключают альянсы для текущего пользователя, поэтому, если Джо является current_user, то я хочу массив объектов User, который не включает Джилл, но включает Боба.
В кодеУ меня так далеко:
# Get all users
user_list = User.all
# Get alliances that are not pending
active_alliances = current_user.where(:pending => false)
Теперь я думал об использовании этого совета для исключения из user_list active_alliances.Итак, мне нужно извлечь из active_alliances одномерный массив, в котором нет ничего, кроме списка user_ids.Я думаю что-то вроде:
# Select just the :ally field (which contains the user_id of the ally)
alliance_id_list = current_user.all(:select => "ally")
Это последнее не совсем то, что я хочу, потому что это дает мне хэш.Теперь я мог бы просто перебрать хеш, но я думаю, что это может быть не лучшим способом.Есть ли прямой способ сделать это?Возможно, установив отрицательное условие для запроса?Спасибо.
Обновление: См. этот вопрос для получения дополнительной информации о том, как решить эту проблему;он может использоваться в сочетании с методом .collect, предложенным ниже.