Rails 4 LIKE query-ActiveRecord 添加引号

我试图做一个类似的查询喜欢这样

def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search],   order => 'name'
end

但是当它运行时,会添加引号,从而导致 sql 语句变成这样

SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):

所以你知道我的问题了。 我正在使用 Rails 4和 Postgres 9,这两个我从来没有使用过,所以不确定如果它和一个 activerrecord 的东西或可能是 Postgres 的东西。

我如何设置这样,我有像 '%my_search%'在最后的查询?

163982 次浏览

您的占位符被字符串替换,并且您没有正确地处理它。

替换

"name LIKE '%?%' OR postal_code LIKE '%?%'", search, search

"name LIKE ? OR postal_code LIKE ?", "%#{search}%", "%#{search}%"

试试看

 def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE  ? OR postal_code like ?", "%#{search}%","%#{search}%"],   order => 'name'
end

有关更多信息,请参见 AREL 条件的 医生

不要使用 Rails 2中的 conditions语法,而是使用 Rails 4的 where方法:

def self.search(search, page = 1 )
wildcard_search = "%#{search}%"


where("name ILIKE :search OR postal_code LIKE :search", search: wildcard_search)
.page(page)
.per_page(5)
end

注意: 上面使用的是参数语法而不是? 占位符: 这两者都应该生成相同的 sql。

def self.search(search, page = 1 )
wildcard_search = "%#{search}%"


where("name ILIKE ? OR postal_code LIKE ?", wildcard_search, wildcard_search)
.page(page)
.per_page(5)
end

注意: 对于 name-postgres 不区分大小写的 LIKE 版本使用 ILIKE

虽然字符串插值将工作,因为您的问题指定轨道4,您可以使用 Arel 为此,并保持您的应用程序数据库不可知。

def self.search(query, page=1)
query = "%#{query}%"
name_match = arel_table[:name].matches(query)
postal_match = arel_table[:postal_code].matches(query)
where(name_match.or(postal_match)).page(page).per_page(5)
end
.find(:all, where: "value LIKE product_%", params: { limit: 20, page: 1 })

ActiveRecord 非常聪明,它知道 ?引用的参数是一个字符串,因此它用单引号将其括起来。您的 可以作为一个职位建议使用 Ruby 字符串插值填充字符串与所需的 %符号。但是,这可能使您暴露于 SQL 注入(这是不好的)。我建议您使用 SQL CONCAT()函数来准备字符串,如下所示:

“ name LIKE CONCAT (’%’,? ,’%’)或邮政编码 LIKE CONCAT (’%’,? ,’%’)”,搜索,搜索)

如果有人使用像 "key""value"这样的列名,那么您仍然会看到相同的错误,即 mysql 查询语法是错误的。这应该能够解决:

.where("`key` LIKE ?", "%#{key}%")