如何在不相等的条件下查找数据库中的记录?我现在有这个,但有一种奇特的铁路说话方式吗?
GroupUser.where('user_id != ?',me)
答案 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)