2015-06-08 113 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本身不会执行此操作。