Я пытаюсь создать разнообразную систему управления турнирами , которая допускает несколько типов бэкэндов турнирной сетки.Цель состоит в том, чтобы предоставить очень простую опцию для бэкенда турнирной сетки (здесь PlasTournament
) и возможность нескольких более сложных бэкэндов (прямо сейчас, просто Challonge::Tournament
, то есть от Challonge ,используя challonge-api драгоценный камень через API ).
Мои модели:
class Tournament < ActiveRecord::Base
belongs_to :event
validates :event, :presence => true
has_one :remote, :as => :tournament_bracket, :dependent => :destroy
end
class PlasTournament < ActiveRecord::Base
belongs_to :winner, :class_name => "User"
belongs_to :creator, :class_name => "User"
belongs_to :tournament_bracket, :polymorphic => true
has_and_belongs_to_many :participants, :class_name => "User"
end
Там также Challonge::Tournament
, но я не уверен, как заставить его соответствовать этому стилю.Нужно ли мне это сделать?Это класс ActiveResource, и мне действительно нужно хранить только в полиморфной ассоциации в классе Tournament
его класс и идентификатор.
У меня ранее были следующие модели:
class Tournament < ActiveRecord::Base
belongs_to :event
validates :event, :presence => true
has_one :remote_tournament, :as => :tournament_bracket, :dependent => :destroy
end
class RemoteTournament < ActiveRecord::Base
belongs_to :tournament_bracket, :polymorphic => true
def tournament_bracket_type_type=(sType)
super(sType.to_s.classify.constantize.base_class.to_s)
end
end
class PlasTournament < RemoteTournament
belongs_to :winner, :class_name => "User"
belongs_to :creator, :class_name => "User"
belongs_to :tournament_bracket, :polymorphic => true
has_and_belongs_to_many :participants, :class_name => "User"
end
или что-то подобноетот.Это не сработало, и я не совершил это, как делал выше.
В идеале, я хотел бы иметь возможность сделать что-то подобное в методе create
моего контроллера (и я знаю,что-то из этого может быть обработано передачей params[:tournament]
в #new; я просто опишу этот пример):
@tournament = Tournament.new
@tournament.event = params[:tournament][:event_id]
@tournament.name = params[:tournament][:name]
@remote = params[:tournament][:remote_type].constantize.new
#set its state
@tournament.remote = @remote
@tournament.save!
, а затем в Tournament#show
сделайте что-то вроде этого:
@tournament = Tournament.find params[:id]
#the only things I need from Tournament are the
#name, description, max_participants, and remote
@remote = @tournament.remote
#^this is primarily for shorthand access
Затем, в представлении, я могу выдать некоторые частичные или виджеты, основанные на классе remote
.
case remote.class
when PlasTournament
render :partial => 'brackets/plas'
when Challonge::Tournament
render :partial => 'brackets/challonge'
end
Я выключен?Это кажется довольно простым, но я думаю, что я пойман в деталях реализации Rails.
То, что я ищу, - это, по сути, способ скрыть полиморфные системы брекетинга турниров за турнирным классом.