2012-04-01 3 views
3

한다고 가정 I 사용자 데이터가 해당 문자열 데이터 형식 애완 동물의 저장 배열레일 액티브 레코드 쿼리, 직렬화 된 배열

[ 
    #<User id: 1, name: "John", pets: "---\n- cat\n- dog\n- bunny\n- ''\n">, 
    #<User id: 2, name: "Pete", pets: "---\n- dog\n- bunny\n- ''\n">, 
    #<User id: 3, name: "Jack", pets: "---\n- cat\n- ''\n">, 
    #<User id: 4, name: "Kurt", pets: "---\n- cat\n- bunny\n- ''\n"> 
] 

내가 고양이를 가지고 모든 사용자를받을 수 있습니까? 어쩌면 User.find_all_by... 또는 User.where(....) 또는 관계로 반환하는 것과 같은 것일 수 있습니까? 그래서 나는 적극적인 레코드 질의로 주문할 수 있습니다.

나는 내가

User.all.select{|s| YAML.load(s.pets).include?'cat'} 

와 고양이를 가지고 모든 사용자를 얻을 수 있습니다 알고 있지만, 액티브 레코드 쿼리와 함께 주문 할 수없는 배열을 변환합니다.

thx

+0

검사 어떤 이유로이 문서 http://stackoverflow.com/questions/9814622/searching-serialized-data-using-active-record – hiphapis

답변

1

데이터를 표준화하고 Pet 모델을 추가하고 해당 모델간에 has_and_belongs_to_many 연관을 설정해야합니다.

+0

, 내가 다른 모델을 추가하는 것을 방지한다. 더 나은 해결책이 없다면 나에게 좋다. thx – raymondralibi

3

간단한 SQL을 사용하여 'cat'이 직렬화 된 열에 나타나는지 확인할 수 있습니다.

User.where('pets LIKE "%cat%"').all

+2

또한 "메기"를 검색합니다 – raymondralibi

+0

좋은 점 - 그렇다면 User.where ('애완 동물처럼 "% cat \\ n %"'). 모두 – frontendbeauty