我找不到相当于“不喜欢”的活动记录。我能够找到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的任何新增功能都可以实现这一目的吗?
答案 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))