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)