Answers:
在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的答案
GroupUser.where(other_condition: true).where.not(user_id: user_id)
MetaWhere有一个较新的表亲,称为Squeel,它允许这样的代码:
GroupUser.where{user_id != me}
不用说,如果这是您要进行的唯一重构,则不值得使用gem,而我只会坚持使用您得到的东西。Squeel在您有许多复杂的查询与Ruby代码交互的情况下很有用。
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)
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
呢
处理关联时,应始终在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)
如@ dr4k3所说,在Rails 4中,not
已添加了查询方法:
GroupUser.where.not(user: me)