Ruby on rails Rails ActiveRecord如何查找未与特定其他记录连接的所有记录?

Ruby on rails Rails ActiveRecord如何查找未与特定其他记录连接的所有记录?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我想搜索所有不属于组1组的用户,由UserGroups加入,即查找没有UserGroups记录将其绑定到组1的所有用户 我可以使用User.all查找所有用户,也可以使用User.where'name like'、“%”或“%”参数[:search]+“%”查找所有用户 我甚至可以找到那些没有会员资格的人: User.includes(:user_groups).where( :user_groups => { :user_id => nil } ) 但是我怎么说呢,找到不是组1成

我想搜索所有不属于组1组的用户,由UserGroups加入,即查找没有UserGroups记录将其绑定到组1的所有用户

我可以使用User.all查找所有用户,也可以使用User.where'name like'、“%”或“%”参数[:search]+“%”查找所有用户

我甚至可以找到那些没有会员资格的人:

User.includes(:user_groups).where( :user_groups => { :user_id => nil } )
但是我怎么说呢,找到不是组1成员的所有用户

更新:以下是它的有效SQL:

select * from Users as u where not exists (select 1 from UserGroups where group_id = 1 and user_id = u.id);
或者,如果您希望缓存的不在

更新:

我现在发现的唯一方法是原始SQL,但我喜欢真正的ActiveRecord方法:

User.where('name like ? and id not in (select user_id from UserGroups where group_id = ?)' , '%'+params[:search]+'%',@group.id)

在where子句中,尝试使用类似的“字段不在列表中”

User.includes(:user_groups).where('user_id not in (?)', :group_1_id)
在您的案例中,用组1的标识符替换组1的id。 我从这里得到的

但是我没有测试它。因此,您可以尝试使用具体的语法。

如下:

select user_id from UserGroups where group_id = 1;
…基本上是:

@group.user_groups.select(:user_id)
像这样的方法存在于许多关联中。对于构建子查询,似乎是这样。 因此:

select * from Users as u
where u.id not in (select user_id from UserGroups where group_id = 1);
这是:

User.where.not(id: @group.user_groups.select(:user_id))
条件中的值是一个关系,因此它作为子查询嵌入。 这是:

select * from Users as u
where not exists
  (
    select 1 from UserGroups
    where group_id = 1 and user_id = u.id
  );
是。。。唯一棘手的部分是我们必须引用外部表的值,它在查询中不是常量。所以我们必须以另一种方式引用表的字段。一点槟榔就可以了:

users = User.arel_table # `arel_table` is a sign of some serious SQL business
User.where(@group.user_groups.where(user_id: users[:id]).exists.not)
你可能还想看看


您也可以使用从具有多个到的ID,但我不知道它是否会从加入模型而不是加入模型中获取ID。

但这不会过滤掉所有具有任何成员资格的用户吗?我只想把那些没有第一组成员资格的人登记出来。如果某个用户在组2中有成员资格,我想列出他们。不确定您的情况下是什么:User\u groups。也许用你想排除的组的特定id替换它。哦,我明白了,你正在使用not in,但这是不完整的?我将尝试ittry this-User。包括:User\u groups.where User\u groups.User\u id!=users.id和group_id=@group.id.wherename LIKE?,“%”+参数[:search]+“%”。引用:user_groupsHmm@R_O_R,不同。不是不在,而是使用连接。@deith好吧,你得到了想要的结果吗?是的,是的,@R\u O\R,但我正试图在ActiveRecord中实现它。看D边的答案,太棒了。好的。。我没有测试我给出的代码,这就是为什么我也要由您确认,看看我的逻辑是否是假的p谢谢你试一试..当,@D-side,太酷了。它几乎起作用了。问题是@group.user\u group\u id等同于从用户组中选择id,其中group\u id=1,而不是从…..中选择user\u id。。。。。区别在于它是从连接表中选择id而不是用户id。如果我能做到这一点,我会喜欢它。我可以选择“不在”而不是“不存在”,因为它允许缓存,正如许多人指出的那样。嗯,不完全是,它返回所有用户。。。我将在几分钟后检查SQL等等,这是不存在的情况下做到了这一点。我正在努力的不在现在…辉煌,你是!我不知道那些不存在的东西,但是那些不存在的东西令人惊讶!表达敬意!
users = User.arel_table # `arel_table` is a sign of some serious SQL business
User.where(@group.user_groups.where(user_id: users[:id]).exists.not)