Rails Modelfind哪里不对等

如何在不同的条件下在我的数据库中查找logging? 我现在有这个,但有没有一个花式的轨道说话的方式呢?

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

在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存储在variables中,或者如果在模型GroupUser本身内部使用,例如在scope ,则可以使用arel_table[:user_id]而不是GroupUser.arel_table[:user_id]

Rails 4.0语法归功于@ jbearden的答案

Rails 4

 GroupUser.where.not(user_id: me) 

MetaWhere是唯一能让你更有趣的方法 。

MetaWhere有一个新的堂兄称为Squeel允许这样的代码:

 GroupUser.where{user_id != me} 

不言而喻,如果这是你要做的唯一的重构,那就不值得使用gem,我会坚持你所得到的。 在有许多复杂的查询与Ruby代码交互的情况下,Squeel非常有用。

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) 

你所拥有的几乎是一个很好的Rails 3的做法,我认为。

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

事实上,如果另一个表有user_id列,并且你join了这两个表,你在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) 

在Rails 3中,我什么都不知道。 但是,我不确定您是否知道,您的不等于(user_id)NULL值不匹配。 如果你想要的话,你必须做这样的事情:

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