2011-03-24 77 views
116

如何在不等於條件的數據庫中查找記錄?我現在有這個,但是有沒有一種花式的滑軌說話方式呢?Rails模型查找不等於

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

回答

207

在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's answer

+0

在協會裏怎麼樣? - has_many:group_users, - > {where.not(status:「Declined」)},通過:: groups,foreign_key:「user_id」 – ajbraus 2014-03-29 14:57:23

+4

作爲一個方面說明,它也可以很好地鏈接:'GroupUser.where(other_condition:true ).where.not(user_id:user_id)' – 2014-12-15 19:00:07

15

你有什麼幾乎是一個很好的Rails 3的做法,我認爲。

27

唯一能找到它的方法是用MetaWhere

MetaWhere有被稱爲Squeel一個新的表妹,讓這樣的代碼:

GroupUser.where{user_id != me} 

不言而喻,如果這是你要做出的唯一的重構,這是不值得使用寶石,我會堅持你得到的。在有許多複雜查詢與Ruby代碼交互的情況下,Squeel非常有用。

+1

MetaWhere是偉大的,但這項任務可以完成,無需添加寶石。 – tybro0103 2012-06-20 21:06:01

+1

@ tybro0103當然,任務可以完成(而且我認爲OP的做法完全沒問題),但問題是要做更有趣的事情。所以如果你認爲沒有寶石就可以做到更漂亮,我會對如何做到這一點非常感興趣。 – 2012-06-21 08:32:13

+0

Vikrant的答案確實提供了一個不涉及sql或包含另一個gem的解決方案。但是,我立場糾正,你的答案絕對是對編碼友好/花哨的。 – tybro0103 2012-06-22 00:22:03

35

軌道4

GroupUser.where.not(user_id: me) 
6

你應該總是包括在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具有b個EEN補充說:

GroupUser.where.not(user: me) 
17

軌道4,5:

如果你想使用不相等,平等,你可以使用:

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) 
+0

'GroupUser.where(group_id:group_id).where.not(user_id:user_id)''怎麼辦? – 2014-12-15 18:59:02

+0

@EnricoCarlesso感謝發佈。我更新了我的答案,以包含您的建議。謝謝。 – 2014-12-16 18:47:43

6

在Rails 3,我什麼都不知道票友。但是,我不確定您是否知道,您的不等於(user_id)NULL值不匹配。如果你想這樣做,你將不得不這樣做:

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