activerecord不喜欢查询

时间:2015-06-08 21:03:38

标签: ruby-on-rails activerecord

我找不到相当于“不喜欢”的活动记录。我能够找到where.not,但这将检查字符串是否与值不匹配,如下所示:

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

is the same as:

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

我正在寻找一个NOT LIKE,其中的值不包含在字符串中。等效的sql查询如下所示:

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

在ActiveRecord中,我现在可以使用以下内容:

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

但这还有很多不足之处。 Rails 4的任何新增功能都可以实现这一目的吗?

4 个答案:

答案 0 :(得分:14)

嗯,你可以这样做:

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

注意:这仅适用于Rails 4。

答案 1 :(得分:12)

正如其他人所指出的,ActiveRecord没有很好的语法来构建like语句。我建议使用Arel,因为它使查询更少数据库平台特定(对于其他平台,将使用ilike用于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

答案 2 :(得分:1)

不幸的是,ActiveRecord没有like查询构建器。我同意原始的“不喜欢”有很多不足之处;你可以把它变成一个范围(scope :not_like, (column, val) -> { ... }),但AR本身不会这样做。

答案 3 :(得分:0)

仅添加活动记录“ where.not”的答案。 “ where.not”也将排除空值。即查询User.where.not(name:'Gabe')将保留名称为'Gabe'的记录,但也会排除具有NULL值的名称列。因此,在这种情况下,解决方案将是

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