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来剔除有效的。
答案 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) )