2013-05-08 2 views
-1

mysql 데이터베이스의 letters 열에 다음 데이터가 있습니다. 내가 그들을 varchar에 저장했습니다 :데이터베이스의 문자열 배열입니다. 일치 및 반환 값

letters 
["a","b"] 
["a","b","d"] 
["a","d"] 
["d","c","e"] 
["e","c","f"] 
["c","f"] 
["f","e"] 

일부 요소를 찾으려고합니다.

["a","b"] 
["a","b","d"] 
["a","d"] 

을 내가, 내가 반환 할 params[:lttrs]"c,e"로있을 때 :

["d","c","e"] 
["e","c","f"] 

내 시도가 각각 일치하는 모든 행을 검색하는 것입니다 내가 "a"params[:lttrs]을 때, 나는 돌아가려면 그 (것)들의 사이에서 include?('a')와 더불어, 그러나, 나는 단 하나 성분을 한번에해서 좋다. 그게 그 접근인가?

+1

params [: lttrs]가 "a, c, e"또는 "b, d, e, f"일 때 어떻게됩니까? –

답변

0

와일드 카드가 일치하는 LIKE 연산자를 사용할 수 있습니다. 이 솔루션은 루비를 사용하는 것보다 빠릅니다. 그러나 큰 테이블을 가지고 있다면 느려질 것입니다. 데이터 디자인의 이유에 대한 자세한 내용을 제공 할 경우 대안 접근 방법을 제안 할 수 있습니다.

like_params = params[:lttrs].split(",").map{|letter| "%#{letter}%"} 
like = like_params.map{ "LIKE ?"}.join(" OR ") 
Model.where(like, like_params) 
0

당신은 같은 일을 시도 할 수 :

query = "letters " 
r = 1 
letters_arr = params[:lttrs].split(",") 
letters_arr.each do |l| 
    if r == 1: 
    query << " like '%#{l}%'" 
    else 
    query << " or like '%#{l}%'" 
    end 
end 

letters_found = WhateverModel.where (쿼리)는 params를보다 더 안전하게 처리하고 있는지 확인 할 필요가 분명히

하지만, 그것은 당신을 당신의 길로 인도해야합니다.