2012-05-25 2 views
1

내 경로 파일의 절반 이상이 제약 조건 (및 해당 클래스)과 함께 처리되므로 더 좋은 방법이 있는지 궁금합니다. 다른 애완 동물을 추가하면 각각의 애완 동물은 동일하므로 파일이 매우 길어질 수 있습니다.Rails 경로에서 이러한 제약 조건을 수행하는 더 좋은 방법이 있습니까?

class AkcConstraint 
    TYPES = %w[sporting-group hound-group working-group terrier-group toy-group non-sporting-group herding-group misc-class] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:akc_group] 
    end 
end 

class AnkcConstraint 
    TYPES = %w[toy-group terrier-group gundog-group hound-group working-group utility-group non-sporting-group] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:ankc_group] 
    end 
end 

class CkcConstraint 
    TYPES = %w[sporting-group hound-group working-group terrier-group toy-group non-sporting-group herding-group] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:ckc_group] 
    end 
end 

class FciConstraint 
    TYPES = %w[group-1 group-2 group-3 group-4 group-5 group-6 group-7 group-8 group-9 group-10] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:fci_group] 
    end 
end 

class IkcConstraint 
    TYPES = %w[group-1 group-2 group-3 group-4 group-5 group-6 group-7 group-8 group-9 group-10] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:ikc_group] 
    end 
end 

class KcConstraint 
    TYPES = %w[hound-group working-group gundog-group terrier-group utility-group pastoral-group toy-group] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:kc_group] 
    end 
end 

class KusaConstraint 
    TYPES = %w[hound-group working-group gundog-group terrier-group utility-group pastoral-group toy-group] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:kusa_group] 
    end 
end 

class NzkcConstraint 
    TYPES = %w[toy-group terrier-group gundog-group hound-group working-group utility-group non-sporting-group] 
    def self.matches?(request) 
    TYPES.include? request.path_parameters[:nzkc_group] 
    end 
end 


# For dog groups and types 
match 'dogs/akc/:akc_group', :to => "dogs#index", :as => "akc_dogs", 
         :constraints => AkcConstraint 
match 'dogs/ankc/:ankc_group', :to => "dogs#index", :as => "ankc_dogs", 
         :constraints => AnkcConstraint 
match 'dogs/ckc/:ckc_group', :to => "dogs#index", :as => "ckc_dogs", 
         :constraints => CkcConstraint 
match 'dogs/fci/:fci_group', :to => "dogs#index", :as => "fci_dogs", 
         :constraints => FciConstraint 
match 'dogs/ikc/:ikc_group', :to => "dogs#index", :as => "ikc_dogs", 
         :constraints => IkcConstraint 
match 'dogs/kc/:kc_group', :to => "dogs#index", :as => "kc_dogs", 
         :constraints => KcConstraint 
match 'dogs/kusa/:kusa_group', :to => "dogs#index", :as => "kusa_dogs", 
         :constraints => KusaConstraint 
match 'dogs/nzkc/:nzkc_group', :to => "dogs#index", :as => "nzkc_dogs", 
         :constraints => NzkcConstraint 

나는 무엇보다 성능에 대해 우려하고 있습니다. 걱정해야합니까? 더 좋은 방법이 있습니까? 등 Akc, Ankc, Ckc 모든 가정

+0

경로를 통해 슬러그를 구현하려는 것 같습니다. 아마도 [friendly_id] (https://github.com/norman/friendly_id) 등을 볼 수 있습니다. –

+0

안녕하세요 앤드류, 그들은 개 모델의 AR 모델, 필드 및 값만입니다. 나는 '레지스트리'모델을 만드는 것을 고려해 봤지만 가능하다면 피하고 싶었던 URL (dogs/registry/akc/working-dogs 등)에 또 다른 요소를 도입 할 것입니다. – A4J

답변

1

동일한 모델, 예컨대 상속 Club (나는 분명히 그들이 할 수 있기를 바란다), 그러면 당신은 분명히 이것을 더 간결하게, 적어도, 그리고 아마도 더 효율적으로 만들 수있다. 이런 식으로 뭔가 :

class ClubConstraint 
    Types = { # in actuality this should come from your database and not be 
      # hard-coded; otherwise it's going to be a big maintenance headache 
    :akc => %w[ sporting-group hound-group working-group 
       terrier-group toy-group  non-sporting-group 
       herding-group misc-class ], 
    # ... 
    :nzkc => %w[ toy-group  terrier-group gundog-group 
       hound-group  working-group utility-group 
       non-sporting-group ], 
    }.freeze 

    def matches? request 
    pparams = request.path_parameters 
    return unless club_groups = Types[ pparams[ :club ] ] 

    club_groups.include? pparams[ :group ] 
    end 
end 

# For dog groups and types 
match 'dogs/:club/:group', :to => "dogs#index", 
     :constraints => ClubConstraint.new 

이 내가 (당신의 :as => 옵션을 재 구현이 필요합니다)를 테스트하지 않았기 때문에 기록 된대로 작동하지 않을 수 있습니다,하지만 당신은 아이디어를 얻을.

+0

안녕하세요, 요르단, 해답을 가져 주셔서 감사합니다. 그들은 AR 모델이 아니며 Dog 모델의 필드와 값입니다. Andrew에게 언급했듯이, 나는 '레지스트리'모델을 만드는 것을 고려해 봤지만 가능한 경우 피하고 싶었던 URL (dogs/registry/akc/working-dogs 등)에 또 다른 요소를 도입 할 것입니다. – A4J

+0

클럽을 URL 매개 변수로 끌어 내면 멋지게 작동합니다. 그것이 내가 제안했을 것입니다. 유형을 모델로 이동하는 것은 이러한 변경을 자주하지 않기 때문에 필요하지 않습니다. 대신 업데이트를 수행하기 위해 배포를 수행해야합니다. – excid3

+0

Ok ... 마침내 얻었습니다! '다형성 (polymorphic)'HABTM (클럽과 개/고양이의 경우 조인 모델의 pm)을 포함하여 다양한 방식으로 놀았지만 너무 지나치게 빠르다. 결국 두 개의 모델, 클럽 및 그룹을 만든 다음 요르단과 이전 모델이 섞인 구속 조건을 코드 줄 7 개로 사용했습니다. 내 유일한 관심사는 클럽/그룹을 저장하는 모델을 사용하고 (따라서 경로 파일에이 모델을 호출 함) 요청이 db에 도달 한 사이트로 전송 될 때마다이를 의미합니까? 또는 Rails는 이와 같은 라우팅 쿼리를 캐시합니까? 내가 걱정해야 할까? 도와 줘서 고마워! – A4J

관련 문제