如何在不相等的条件下查找数据库中的记录?我现在有了这个,但是有没有一种花哨的轨道式的方法呢?
GroupUser.where('user_id != ?',me)
唯一的方法,你可以得到它更花哨的是与 MetaWhere。
MetaWhere 有一个新的表亲,叫做 吱吱,它允许这样的代码:
GroupUser.where{user_id != me}
不用说,如果这是你要做的唯一的重构,那么就不值得使用 gem,我会坚持使用你已经得到的。在许多复杂查询与 Ruby 代码交互的情况下,Squeel 非常有用。
在 Rails 4.x 中(见 http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions)
GroupUser.where.not(user_id: me)
在 Rails3.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]
GroupUser.arel_table
GroupUser
scope
arel_table[:user_id]
GroupUser.arel_table[:user_id]
Rails 4.0对 @ jBearden 的回答的语法要求
铁路4
在处理关联时,应该在 SQL 查询中包含表名称。
实际上,如果另一个表具有 user_id列,并且您将两个表联接在一起,那么在 SQL 查询中将会出现一个不明确的列名(即“麻烦”)。
user_id
那么,在你的例子中:
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:
not
GroupUser.where.not(user: me)
铁轨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)
在 Rails 3中,我不知道还有什么更好的。但是,我不确定您是否意识到,您的不相等条件与(user _ id) NULL 值不匹配。如果你想那样,你就得这样做:
GroupUser.where("user_id != ? OR user_id IS NULL", me)