레일 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}%"
를 사용하는 대신conditions
Rails 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
참고: 사용ILIKE
LIKE의 이름 - 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
'programing' 카테고리의 다른 글
이클립스 IDE에서 키보드 단축키를 수정하는 방법은 무엇입니까? (0) | 2023.05.07 |
---|---|
--assume-unchanged로 표시된 파일 목록을 얻을 수 있습니까? (0) | 2023.05.07 |
Swift의 전역 상수 파일 (0) | 2023.05.07 |
[]와 []의 차이점은 무엇입니까? (0) | 2023.05.07 |
pyMongo를 사용하여 ISO 날짜 만들기 (0) | 2023.05.02 |