나는 같은 쿼리를하려고합니다.
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
참고 : 위의? 대신 매개 변수 구문을 사용합니다. 자리 표시 자 : 둘 다 동일한 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 })
답변
