2012-06-12 3 views
0

트랙 수는 쉼표로 구분 된 4 개의 문자열로 구성되어 있으며 원하는 수만큼 검색 할 수 있어야합니다.배열이있는 쿼리와 비슷합니다.

Track.first.genre => "Alternative, Lite Rock, Indie Rock, Psychedelic" 
Track.first.mood => "Aggressive, Angry, Dark, Driving, Energetic, Heavy" 
Track.first.tempo => "Fast, Medium" 
Track.first.artist => "something" 

사용자는 표시되는 트랙 목록의 범위를 좁히기 위해 임의의 개수의 용어를 사용할 수 있습니다. 각 열과 일치하는 배열로 용어를 수집합니다. 예 :

genres = params[:genre].split(",") 
moods = params[:mood].split(",") 

등등. 따라서 genres => [ "Rock", "Alternative"] 인 경우 장르 열의 해당 용어 중 하나를 포함하는 모든 트랙과 일치하며 모든 추가 용어는 해당 반환 배열에서 선택합니다. 열.

이 작업을 수행하는 가장 좋은 방법은 무엇이며 어떻게 배열을 조건으로 사용하여 where 쿼리를 작성합니까?

+1

엔티티와 관계를 재평가해야 할 필요가 있다고 생각합니다. 장르/분위기/템피가 트랙과 다 대다 관계를 갖고있는 것으로 보입니다. –

+0

@PlatinumAzure - 트랙 모델의 모든 속성입니다. 원래 각각은 하나의 문자열이 될 것이지만, 클라이언트는 이후 내 ("genre in (?)"장르) 쿼리를 사용할 수 없도록 여러 열을 각 열에 추가했습니다. – aperture

+0

나는 (트랙 모델의 속성이되는) 디자인이 아마도 다시 고쳐질 필요가 있다고 말하고 있습니다. 그들은 그들 자신의 모델이어야한다. 나중에 고마워 할거야. –

답변

1

^장르, 기분에 대한 모델 사용을 고려하십시오 & 템포. ActiveRecord는 이러한 쿼리를 훨씬 쉽게 포함하는 쿼리를 만듭니다.

^serialize 선언을 사용하면 번역본을 절약 할 수 있습니다.

^당신은 당신의 위치를 ​​호출을 원하는 배열 요소, 예컨대 :

class Track < ActiveRecord::Base 
    def self.for_genre(name) 
    where "genre like '%#{name}%'" 
    end 
end 

이 다른 이름의 문자열 아닌 이름을 선택하는 의미를 검색 할 수 있습니다.