Rails 4 LIKE查询 – 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这两个我从来没有用过,所以不知道如果它和一个activerecord的事情或可能postgres的事情。
我如何设置这个,所以我喜欢在结束查询中的'%my_search%'
?
您的占位符被replace为一个string,你没有正确处理。
更换
"name LIKE '%?%' OR postal_code LIKE '%?%'", search, search
同
"name LIKE ? OR postal_code LIKE ?", "%#{search}%", "%#{search}%"
而不是使用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
注意:使用ILIKE
作为名称 – postgres不区分大小写的LIKE版本
虽然string插值可以工作,因为你的问题指定了rails 4,所以你可以使用Arel来保持你的app数据库不可知。
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
尝试
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条件的文档 。
ActiveRecord足够聪明,知道参数由?
是一个string,所以它用单引号括起来。 你可以作为一个postbuild议使用Rubystring插值填充string所需的%
符号。 但是,这可能会暴露给SQL注入(这是不好的)。 我build议你使用SQL CONCAT()
函数来准备这样的string:
"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)
.find(:all, where: "value LIKE product_%", params: { limit: 20, page: 1 })