Rails: Is this a precedent for unidirectional inheritance (STI)?

Consider this setting. Please understand that our setup is much more detailed, but this is a simple example.

competitionwhich has name. This is an annual competition. competition_instancesThat is location, starts_at.
Every competition has sportsone that has name.

Example
competition. nameA: “Super Bowl” is different competition_instancesevery year, but sportremains the same.
And vice versa competition. name: “Olympics” has different competition_instancesand different sportsin each competition_instance.

Would it be better to create competition_sportsand competition_instance_sportsusing competition_instance_sportsas a subclass competition_sports?

GOAL . Use competition_instance_sportsrecords if they exist, otherwise use a record competition_sports. In our application for the real world, each contest / contest _instance can have 20-50 sports records. How can we achieve the best result?

+4
source share
4 answers

I just think about the case when there are standard sports that are always at the Olympic Games, and some of them are added, for example, offered by the host country.

I would use Polymorphic associations in the "way back" .

class Competition < ActiveRecord::Base
  has_many :competition_instances
  has_many :competition_sports, as: :event
end

class CompetitionInstance < ActiveRecord::Base
  belongs_to :competition
  has_many :competition_sports, as: :event

  def events_array  # neater by sacrificing ActiveRecord methods
    competition.competition_sports + competition_sports
  end

  def events        # messier, returns ActiveRecord relationship
    CompetitionSport.where( " ( event_id = ? AND event_type = 'Competition' ) OR
                              ( event_id = ? AND event_type = 'CompetitionInstance')", competition_id, id )
  end
end

class Sport < ActiveRecord::Base
  has_many :events, as: :competition_sport
end

class CompetitionSport < ActiveRecord::Base
  belongs_to :sport
  belongs_to :event, polymorphic: true
end

This allows:

competition.competition_sports            # standard sports
competition_instance.competition_sports   # only those specific for this instance
competition_instance.events               # includes sports from both
+1
source

, , , . , .

sports, . competition_instance.rb / sport.rb. competiton.rb sports competition_instance.rb.

competition.rb

Class Competition < ActiveRecord::Base
   has_many :competition_instances
   has_many :sports, through: :competition_instances
end

competition_instance.rb

Class CompetitionInstance < ActiveRecord::Base
   belongs_to :competition
   belongs_to :sport
end

sport.rb

Class Sport < ActiveRecord::Base
   has_many :competition_instances
end

, :

1- .

2- .sports, .

3. ( event_start_time event_end_time) .

+2

" ", , , . , :

( ) Rails - eugenius:

STI , , . , , STI .

, , competition competition_instance , , . , , , , event competition, - , . "" , "100 " , . "SuperBowl" 2014 , "SuperBowl XLIX".

database-normalization, STI . , .

, , , , .

+1

, competition_instance competition 1 competition competition_instances. , 3 :

competitions
sports
competition_instances

competition_instances competitions, 1 competition competition_instances, competition_instance competition.

sports competitions competition_instances, . , " competition/competition_instance 20-50 sport ". , competition_instance sport, , sports competition, competitions sport, competition_instance. , .

0

Source: https://habr.com/ru/post/1618136/


All Articles