Rails模型找到不相等的地方

时间:2011-03-24 22:39:21

标签: ruby-on-rails ruby-on-rails-3

如何在不相等的条件下查找数据库中的记录?我现在有这个,但有一种奇特的铁路说话方式吗?

GroupUser.where('user_id != ?',me)

7 个答案:

答案 0 :(得分:223)

在Rails 4.x中(参见http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions

GroupUser.where.not(user_id: me)

在Rails 3.x

GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))

要缩短篇幅,您可以将GroupUser.arel_table存储在变量中,或者如果在模型GroupUser内使用,例如在scope中,则可以使用arel_table[:user_id]代替GroupUser.arel_table[:user_id]

Rails 4.0语法归功于@jbearden's answer

答案 1 :(得分:38)

Rails 4

GroupUser.where.not(user_id: me)

答案 2 :(得分:27)

使用MetaWhere的唯一方法就是让它变得更加漂亮。

MetaWhere有一个名为Squeel的新表兄弟,它允许这样的代码:

GroupUser.where{user_id != me}

不用说,如果这是你要制作的唯一重构,那么使用宝石是不值得的,我会坚持你所得到的。在有许多复杂查询与Ruby代码交互的情况下,Squeel非常有用。

答案 3 :(得分:21)

Rails 4:

如果您想使用两者不等于和等于,您可以使用:

user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)

如果您想使用各种运算符(例如。><),您可能需要在某些时候将符号切换为以下内容:

GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)

答案 4 :(得分:15)

我认为你所拥有的Rails 3是一种很好的方式。

答案 5 :(得分:7)

在处理关联时,您应该始终在SQL查询中包含表名。

实际上,如果另一个表具有user_id列并且您同时加入了两个表,那么SQL查询中的列名称将会不明确(即麻烦)。

所以,在你的例子中:

GroupUser.where("groups_users.user_id != ?", me)

或者更冗长:

GroupUser.where("#{table_name}.user_id IS NOT ?", me)

请注意,如果您使用哈希,则无需担心,因为Rails会为您处理:

GroupUser.where(user: me)

在Rails 4中,如@ dr4k3所述,已添加查询方法not

GroupUser.where.not(user: me)

答案 6 :(得分:6)

在Rails 3中,我不知道任何更高级的东西。但是,我不确定您是否知道,您的不等条件与(user_id)NULL值不匹配。如果你想要,你必须做这样的事情:

GroupUser.where("user_id != ? OR user_id IS NULL", me)