2015-06-08 145 views
9

我找不到與「不喜歡」相當的activerecord。我能找到一個where.not,但會檢查是否有字符串不匹配的值,像這樣:activerecord不喜歡查詢

User.where.not(name: 'Gabe') 

is the same as: 

User.where('name != ?', 'Gabe') 

我一直在尋找一個不喜歡的,其中值不包含的字符串中。相應的SQL查詢看起來像如下:

SELECT * FROM users WHERE name NOT LIKE '%Gabe%' 

在ActiveRecord的我現在能逃脫如下:

User.where("name NOT LIKE ?", "%Gabe%") 

但是,這極不理想很多。任何新的Rails 4的添加,以促進這一點?

回答

11

正如其他人指出的,ActiveRecord對於構建like語句沒有很好的語法。我會建議使用Arel,因爲它使查詢更少的數據庫平臺特定(將使用ilike for sqlite & like其他平臺)。

User.where(User.arel_table[:name].does_not_match('%Gabe%')) 

你也可以實現這個作爲一個範圍包含實施模型:

class User < ActiveRecord::Base 
    scope :not_matching, 
    -> (str) { where(arel_table[:name].does_not_match("%#{str}%")) } 
end 
+1

我隨訪,發現'does_not_match'這裏,萬一別人都納悶:HTTP:// WWW .rubydoc.info/github上/導軌/ AREL /阿雷爾/推步 – pdobb

9

嗯,你可以這樣做:

User.where.not("name LIKE ?", "%Gabe%") 

注意:這僅僅是Rails的4

1

可不幸的是ActiveRecord的沒有一個like查詢生成器。我同意原始的「不同意」留下了許多不足之處;您可以將其設爲示波器(scope :not_like, (column, val) -> { ... }),但AR本身不會執行此操作。