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 })