Как получить и исключить некоторые идентификаторы из запроса ActiveRecord? - PullRequest
0 голосов
/ 29 декабря 2010

У меня есть объект 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, предложенным ниже.

1 Ответ

1 голос
/ 29 декабря 2010

Я не уверен, что правильно читаю ваш вопрос, но, похоже, вам просто нужно собрать идентификаторы пользователей альянса:

User.where("ally not in ?", current_user.alliances.collect(&:user_id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...