복붙노트

[RUBY-ON-RAILS] 4 LIKE 쿼리를 레일 - 액티브 따옴표를 추가

RUBY-ON-RAILS

4 LIKE 쿼리를 레일 - 액티브 따옴표를 추가

그래서 같은 쿼리 같은 작업을 수행하려고

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'%')):

그래서 당신은 내 문제를 볼 수 있습니다. 나는 레일 4와 그와 액티브 일 또는 가능성이 포스트 그레스 일이 있다면 그렇게하지 않도록 사용한 적이 둘 다 포스트 그레스 (9)를 사용하고 있습니다.

내가 최종 쿼리에서 '% my_search %'처럼 그래서 어떻게이 설정할 수 있습니다?

해결법

  1. ==============================

    1.당신의 자리 문자열로 대체 당신은 제대로 처리하지 있습니다.

    당신의 자리 문자열로 대체 당신은 제대로 처리하지 있습니다.

    바꾸다

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

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

    2.대신, 레일 (2)로부터 조건 구문을 사용하는 사용하는 방법 대신 4 개 곳의 레일 :

    대신, 레일 (2)로부터 조건 구문을 사용하는 사용하는 방법 대신 4 개 곳의 레일 :

    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를 사용하여 - 포스트 그레스 경우 LIKE의 영향을받지 버전

  3. ==============================

    3.문자열 보간이 작동하지만 귀하의 질문에 지정하는 4 레일로, 당신은 이것에 대한 Arel을 사용하고 앱 데이터베이스 불가지론 유지 될 수 있습니다.

    문자열 보간이 작동하지만 귀하의 질문에 지정하는 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
    
  4. ==============================

    4.액티브는 매개 변수에 의해 참조 것을 알고 영리 충분하다? 문자열이고, 그래서 단일 따옴표로 둘러싸. 하나의 게시물 패드에 필요한 %의 기호 문자열을 사용 루비 문자열 보간을 제시과 같이 할 수있다. 그러나, 이것은 (나쁜되는) SQL 인젝션에 노출 될 수 있습니다. 난 당신과 같이 문자열을 준비하기 위해 SQL CONCAT () 함수를 사용하는 것이 좋습니다 것입니다 :

    액티브는 매개 변수에 의해 참조 것을 알고 영리 충분하다? 문자열이고, 그래서 단일 따옴표로 둘러싸. 하나의 게시물 패드에 필요한 %의 기호 문자열을 사용 루비 문자열 보간을 제시과 같이 할 수있다. 그러나, 이것은 (나쁜되는) SQL 인젝션에 노출 될 수 있습니다. 난 당신과 같이 문자열을 준비하기 위해 SQL CONCAT () 함수를 사용하는 것이 좋습니다 것입니다 :

    "이름 LIKE CONCAT ( '%',?, '%') 또는 우편 _ 번호 LIKE CONCAT ( '%',?, '%')", 검색, 검색)

  5. ==============================

    5.시험

    시험

     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 조건에 문서를 참조하십시오.

  6. ==============================

    6.

    .find(:all, where: "value LIKE product_%", params: { limit: 20, page: 1 })
    
  7. from https://stackoverflow.com/questions/19105706/rails-4-like-query-activerecord-adds-quotes by cc-by-sa and MIT license