Как я могу построить сложную полиморфную ассоциацию, которая включает в себя классы ActiveResource? - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь создать разнообразную систему управления турнирами , которая допускает несколько типов бэкэндов турнирной сетки.Цель состоит в том, чтобы предоставить очень простую опцию для бэкенда турнирной сетки (здесь 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.

То, что я ищу, - это, по сути, способ скрыть полиморфные системы брекетинга турниров за турнирным классом.

...