查询其相关资源对于单个属性都具有相同值的所有特定记录

时间:2014-01-08 18:08:53

标签: sql ruby-on-rails ruby activerecord

class User < ActiveRecord::Base
has_many :memberships

# included columns
# id: integer

---------------------

Membership < ActiveRecord::Base
belongs_to :user

# included columns
# user_id: integer
# active: boolean

我希望能够在单个查询中抓取所有会员资格都为“active = false”的所有用户。到目前为止,我能够提出的最好的是:

#grab possibles
users = User.joins(:memberships).where('memberships.active = false')
#select ones that satisfy condition
users.select{ |user| user.memberships.pluck(&:active).uniq == [false] } 

这不是那么好,因为我必须使用ruby来剔除有效的。

1 个答案:

答案 0 :(得分:0)

这可以解决问题:

users_with_active_membership = User.joins(:memberships).where(memberships: { active: true })
users = User.where( 'users.id NOT IN (?)', users_with_active_membership.pluck(:id) )

我不确定结果,但我希望它是2个嵌套查询,一个选择具有活动成员资格的用户ID,另一个查询选择不在此前一个ID列表中的用户。

我无法测试它,因为我没有这些关系的环境。你能试试并发布生成的SQL查询吗? (添加.to_sql查看)

另一种方式,我不知道哪种方式效率最高:

User.where( 'users.id NOT IN (?)', Membership.where(active: true).group(:user_id).pluck(:user_id) )