Rails 模型发现不相等的地方

如何在不相等的条件下查找数据库中的记录?我现在有了这个,但是有没有一种花哨的轨道式的方法呢?

GroupUser.where('user_id != ?',me)
111682 次浏览

唯一的方法,你可以得到它更花哨的是与 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]

Rails 4.0对 @ jBearden 的回答的语法要求

铁路4

GroupUser.where.not(user_id: me)

在处理关联时,应该在 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)

铁轨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)