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

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.8.16 23:37

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.