Programming

Arel and Rails에서 LIKE 쿼리를 수행하는 방법은 무엇입니까?

procodes 2020. 7. 29. 21:38
반응형

Arel and Rails에서 LIKE 쿼리를 수행하는 방법은 무엇입니까?


나는 다음과 같은 것을하고 싶다 :

SELECT * FROM USER WHERE NAME LIKE '%Smith%';

Arel에서의 나의 시도 :

# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql

그러나 이것은 다음과 같습니다.

SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';

Arel은 쿼리 문자열 'Smith'를 올바르게 랩핑하지만 이것이 LIKE 문이므로 작동하지 않습니다.

Arel에서 LIKE 쿼리는 어떻게 수행합니까?

PS 보너스-실제로 테이블에서 이름과 설명의 두 필드를 스캔하여 쿼리와 일치하는 항목이 있는지 확인하려고합니다. 어떻게 작동할까요?


이것은 arel에서 비슷한 쿼리를 수행하는 방법입니다.

users = User.arel_table
User.where(users[:name].matches("%#{user_name}%"))

추신:

users = User.arel_table
query_string = "%#{params[query]}%"
param_matches_string =  ->(param){ 
  users[param].matches(query_string) 
} 
User.where(param_matches_string.(:name)\
                       .or(param_matches_string.(:description)))

시험

User.where("name like ?", "%#{params[:query]}%").to_sql

추신.

q = "%#{params[:query]}%"
User.where("name like ? or description like ?", q, q).to_sql

Aaand 오랜 시간이지만 @ cgg5207은 수정 사항을 추가했습니다 (길이가 길거나 여러 개의 긴 이름을 가진 매개 변수를 검색하거나 입력하기에 너무 게으른 경우 가장 유용합니다)

q = "%#{params[:query]}%"
User.where("name like :q or description like :q", :q => q).to_sql

또는

User.where("name like :q or description like :q", :q => "%#{params[:query]}%").to_sql

매개 변수 바인딩을 사용하기 위해 Reuben Mallaby의 답변을 더 단축 할 수 있습니다.

User.where("name like :kw or description like :kw", :kw=>"%#{params[:query]}%").to_sql

참고 URL : https://stackoverflow.com/questions/4430578/how-to-do-a-like-query-in-arel-and-rails

반응형