2012-05-25 3 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 

Я думаю, что меня беспокоит производительность больше, чем что-либо еще - стоит ли мне беспокоиться? Есть ли способ лучше?

+0

Кажется, что вы пытаетесь реализовать пули по маршрутам. Возможно, посмотрите на [friendly_id] (https://github.com/norman/friendly_id) и другие. –

+0

Привет, Андрей, они не AR-модели, а просто поля (и значения) в модели Dog. Я подумал о создании модели «реестра», но это представит еще один элемент в URL-адресе (например, собаки/реестр/akc/working-dogs и т. Д.), Которые я хотел избежать, если это возможно. – A4J

ответ

1

Предполагая, что Akc, Ankc, Ckc и т. Д. Все наследуются от той же модели, например. 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. Как я упомянул Эндрю, я подумал о создании модели «реестра», но это представит еще один элемент в URL-адресе (например, собаки/реестр/akc/working-dogs и т. Д.), Который я хотел бы избежать, если это было возможно. – A4J

+0

Вытягивание клуба в URL-адрес будет работать красиво. Вот что я бы предложил. Перемещение типов в модель не требуется, так как вы, вероятно, вряд ли часто меняете их. Вам придется сделать развертывание, чтобы обновить их. – excid3

+0

Хорошо ... наконец-то получилось! Играли с различными способами, включая «полиморфный» HABTM (pm на модели объединения - для клубов и собак/кошек), но это было слишком OTT. Так закончилось создание двух моделей, клубов и групп, а затем использовалось ограничение, которое представляет собой смесь Иордании и моей старой, всего в 7 строках кода. Моя единственная проблема заключается в том, что я использую модель для хранения клубов/групп (и, таким образом, вызывая эту модель в файле маршрутов) означает ли это, что каждый раз, когда запрос отправляется на сайт, удаляется db? или делает запросы маршрутизации кеша Rails, подобные этому? Я должен беспокоиться? Спасибо за помощь ребята! – A4J

Смежные вопросы