programing

레일 4 LIKE 쿼리 - ActiveRecord가 인용문을 추가합니다.

instargram 2023. 5. 7. 10:56
반응형

레일 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

참고: 위에서는 ?placeholder 대신 매개 변수 구문을 사용합니다. 둘 다 동일한 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

참고: 사용ILIKELIKE의 이름 - postgres 대소문자 구분 안 함 버전에 대해

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

다음과 같은 열 이름을 사용하는 경우"key"또는"value"그러면 여전히 mysql 쿼리 구문이 잘못되었다는 동일한 오류가 표시됩니다.이 문제는 다음과 같습니다.

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

해라

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

언급URL : https://stackoverflow.com/questions/19105706/rails-4-like-query-activerecord-adds-quotes

반응형