Rails Active record에서 입력값이 배열일때 검색하는 쿼리는 어떻게 만드나요?


제목 그대로 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 쿼리로 간단하게 해결 할 수 있는 방법은 없을까요?

  • 2016년 08월 12일에 작성됨

조회수 126


1 답변


좋아요
0
싫어요
채택취소하기

두 가지 방법이 있습니다.

(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이라는 정보가 두개의 분리된 배열 칼럼으로 되어 있어야 사용이 가능하겠네요.

  • 2016년 08월 13일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 테이블 분리가 답인거 같네요. 감사합니다!    파츠군   2016.8.16 23:37     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close