[sql] 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를 사용하고 있습니다.

'%my_search%'최종 쿼리에서 와 같이 이것을 어떻게 설정 합니까?



답변

자리 표시자가 문자열로 바뀌고 올바르게 처리하지 못합니다.

바꾸다

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

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


답변

conditionsRails 2 의 구문 을 사용하는 대신 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 버전


답변

문자열 보간이 작동하지만 질문에 레일 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


답변

ActiveRecord는에 의해 참조되는 매개 변수 ?가 문자열 이라는 것을 알기에 충분히 영리 하므로 작은 따옴표로 묶습니다. 당신은 할 수 하나의 게시물 패드에 필요로 문자열을 사용 루비 문자열 보간을 건의 %문자. 그러나 이로 인해 SQL 주입 (나쁜)에 노출 될 수 있습니다. SQL CONCAT()함수를 사용 하여 문자열을 준비하는 것이 좋습니다 .


"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", 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 조건에 대한 문서 를 참조하십시오 .


답변

.find(:all, where: "value LIKE product_%", params: { limit: 20, page: 1 })


답변