如何从ActiveRecord查询中检索和排除某些ID?

如何从ActiveRecord查询中检索和排除某些ID?,activerecord,ruby-on-rails-3,Activerecord,Ruby On Rails 3,我有一个用户对象和一个联盟对象,其中用户有多个:联盟,联盟属于:用户。我希望获得用户列表,但排除当前用户已经与之有活动联盟的用户(如果用户已经有联盟,则:pending字段将为false) 这里有一个具体的例子。假设我们的用户是乔、鲍勃和吉尔。乔和吉尔是积极的盟友,所以乔。联盟将包括吉尔,吉尔,联盟将包括乔。我想要一个为当前用户排除联盟的所有用户的列表,因此如果Joe是当前用户,那么我想要一个不包含Jill但包含Bob的用户对象数组 在代码中,我到目前为止所拥有的: # Get all user

我有一个用户对象和一个联盟对象,其中用户有多个:联盟,联盟属于:用户。我希望获得用户列表,但排除当前用户已经与之有活动联盟的用户(如果用户已经有联盟,则:pending字段将为false)

这里有一个具体的例子。假设我们的用户是乔、鲍勃和吉尔。乔和吉尔是积极的盟友,所以乔。联盟将包括吉尔,吉尔,联盟将包括乔。我想要一个为当前用户排除联盟的所有用户的列表,因此如果Joe是当前用户,那么我想要一个不包含Jill但包含Bob的用户对象数组

在代码中,我到目前为止所拥有的:

# Get all users
user_list = User.all

# Get alliances that are not pending
active_alliances = current_user.where(:pending => false)
现在,我正在考虑使用从用户列表中排除活动的联盟。所以,我需要做的是从活动的\u联盟中提取一个一维数组,除了一个用户\u id列表之外什么都没有。我的想法是:

# Select just the :ally field (which contains the user_id of the ally)
alliance_id_list = current_user.all(:select => "ally")
这最后一个不是我想要的,因为它给了我一个散列。现在,我可以遍历散列,但我认为这可能不是最好的方法。有没有直接的方法可以做到这一点?也许通过为查询设置一个否定条件?谢谢


更新:有关如何解决此问题的更多详细信息,请参阅;它可以与下面建议的.collect方法结合使用。

我不确定我是否正确阅读了您的问题,但看起来您只需要收集联盟用户ID:

User.where("ally not in ?", current_user.alliances.collect(&:user_id))

使用.collect方法可以更接近解决方案。不过,我现在明白了,这个问题不是很清楚,我将尝试提出一个更清楚的问题。谢谢你的建议。