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

时间:2010-12-29 04:42:13

标签: activerecord ruby-on-rails-3

我有一个User对象和一个Alliance对象,其中User has_many:alliances和Alliance belongs_to:user。我想获得一个用户列表,但排除那些current_user已经拥有活跃联盟的用户(如果用户已经有联盟,则:pending字段将为false)。

这是一个具体的例子。假设我们的用户是Joe,Bob和Jill。 Joe和Jill是积极的盟友,所以Joe.alliances将包括Jill和Jill,联盟将包括Joe。我想要一个排除当前用户联盟的所有用户的列表,所以如果Joe是current_user,那么我想要一个不包含Jill但包括Bob的User对象数组。

在代码中,我到目前为止:

# Get all users
user_list = User.all

# Get alliances that are not pending
active_alliances = current_user.where(:pending => false)

现在,我正在考虑使用this tip从user_list中排除active_alliances。所以,我需要做的是从active_alliances中提取一个只有user_id列表的一维数组。我想的是:

# Select just the :ally field (which contains the user_id of the ally)
alliance_id_list = current_user.all(:select => "ally")

这最后不是我想要的,因为它给了我一个哈希。现在,我可以迭代哈希,但我认为这可能不是最好的方法。有没有直接的方法来做到这一点?也许通过为查询设置负条件?感谢。

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

1 个答案:

答案 0 :(得分:1)

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

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