Col*_*lin 127 ruby-on-rails ruby-on-rails-3
如何在不相等的条件下查找数据库中的记录?我现在有这个,但有一种花哨的轨道说话方式吗?
GroupUser.where('user_id != ?',me)
Run Code Online (Sandbox Code Playgroud)
Vik*_*ary 226
在Rails 4.x中(参见http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions)
GroupUser.where.not(user_id: me)
Run Code Online (Sandbox Code Playgroud)
在Rails 3.x中
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Run Code Online (Sandbox Code Playgroud)
要缩短长度,您可以存储GroupUser.arel_table在变量中,或者如果在模型GroupUser本身内部使用,例如,在a中scope,您可以使用arel_table[:user_id]而不是GroupUser.arel_table[:user_id]
Rails 4.0语法归功于@ jbearden的答案
Jak*_*mpl 26
MetaWhere是您获得它的唯一方式.
MetaWhere有一个叫做Squeel的新表兄弟,它允许这样的代码:
GroupUser.where{user_id != me}
Run Code Online (Sandbox Code Playgroud)
不言而喻,如果这是你要制作的唯一重构,那么使用宝石是不值得的,我会坚持你所得到的.在您有许多与Ruby代码交互的复杂查询的情况下,Squeel非常有用.
Ric*_*ith 21
导轨4:
如果你想使用这两个不相等,平等,你可以使用:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Run Code Online (Sandbox Code Playgroud)
(也就是说,如果你想使用多种经营的>,<),在某些时候,你可能希望符号切换到以下几点:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
Run Code Online (Sandbox Code Playgroud)
在处理关联时,应始终在SQL查询中包含表名.
实际上,如果另一个表具有该user_id列并且您加入了两个表,则SQL查询中将出现一个不明确的列名(即麻烦).
所以,在你的例子中:
GroupUser.where("groups_users.user_id != ?", me)
Run Code Online (Sandbox Code Playgroud)
或者更冗长:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用哈希,则无需担心,因为Rails会为您处理:
GroupUser.where(user: me)
Run Code Online (Sandbox Code Playgroud)
在Rails 4中,如@ dr4k3所述,not添加了查询方法:
GroupUser.where.not(user: me)
Run Code Online (Sandbox Code Playgroud)
在Rails 3中,我什么都不知道.但是,我不确定您是否知道,您的不相等条件与(user_id)NULL值不匹配.如果你想要,你必须做这样的事情:
GroupUser.where("user_id != ? OR user_id IS NULL", me)
Run Code Online (Sandbox Code Playgroud)