Rails Active record에서 입력값이 배열일때 검색하는 쿼리는 어떻게 만드나요?
조회수 1206회
제목 그대로 DB에서 값을 가져올 때 입력 값이 배열인데
DB칼럼이 안타깝게도 배열의 각 값과 1:1 대응을 하면 좋겠지만 그렇지 않은 상태입니다.
DB에는
[..., A021, A502, A4152, B051, B202, C075, D252, .... ]
이렇게 들어가 있고
입력값으로 들어가는 배열은
[A, B, C ... ]
이런식으로 들어가는 상태입니다.
그래서 제가 원하는 결과는 입력값이 글자가 해당 칼럼에 포함이 되어 부분일치 했을때 가져오고 싶은데
Datas.where('code LIKE ?', array)
Datas.where('code LIKE ?', '%#{array}%')
Datas.where('code LIKE IN ?', array) # error
rails에서 코드를 이렇게 작성하였는데 이렇게 하니까 SQL에서 배열이 풀어지지 않고
SELECT * FROM ... WHERE code LIKE "['A', 'B']"
이런식으로 쿼리가 들어가더군요
지금도 여러가지로 시도해보고 있는데 하다가 안되면 저 칼럼을 코드와 숫자로 분리해버릴까도 생각중인데
SQL로 하나하나 LIKE 걸어주면 될거 같은데 그건 ruby의 정신에 어긋나는거 같고 분명 편한 방법이 있을텐데
active record 쿼리로 간단하게 해결 할 수 있는 방법은 없을까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
두 가지 방법이 있습니다.
(1) 테이블 분리
배열의 값을 다른 테이블로 분리하는 방법인데요. 예를들어 지금 테이블이 게임의 Player와 보유하고 있는 아이템이라고 가정하고 다음과 같은 테이블이라고 생각해 보겠습니다.
Player id name items 1 Tod [..., 칼021, 칼502, 칼4152, 방패051, 방패202, 반지075, 갑옷252, .... ] 2 ... ... 이렇게 있는 상태에서 칼/방패/반지를 가지고 있는 Player를 찾고 싶은 상태로 가정할 수 있는데요.
player_items테이블을 별도로 만들어서
Player id Category 1 칼021 2 칼502 ... ... n 방패263 위와 같이 저장하시는게 좋을것 같습니다.
(2) taggable-array
다른 방법으로는 array column을 사용하는건데요. Postgresql을 사용하신다면 act-as-taggable-array-on이라는 gem을 사용하실 수 있습니다.
배열로 저장한 column의 이름이
items
라고 했을 때,class Player < ActiveRecord::Base acts_as_taggable_array_on :items end
위와 같이 적어주면
Player.with_any_items(["칼","방패"])
와 같이 하면 Players를 읽어올 수 있습니다. 단, 칼과 021이라는 정보가 두개의 분리된 배열 칼럼으로 되어 있어야 사용이 가능하겠네요.
댓글 입력