Ruby on Rails - 有一个或多个关联

时间:2014-02-13 22:55:41

标签: ruby-on-rails ruby associations

所以我一直在考虑如何为我的应用程序建立关联,但每次从某个角度看模型时,我都认为它没有意义或效率不高。

我有三种模式:锦标赛,RoundRobin和淘汰赛。 比赛既可以是round_robin也可以是淘汰赛,或者两者兼而有之! 所以round_robin或/和淘汰属于锦标赛。

我的条件是我建立的协会很有趣,对我没有意义。

class Tournament < ActiveRecord::Base
    has_many :round_robins
    has_many :eliminations
end

class Elimination < ActiveRecord::Base
    belongs_to :tournament
end

class RoundRobin < ActiveRecord::Base
    belongs_to :tournament
end

我有另一个名为Match的模型。我不知道怎么放它。它应该参加锦标赛还是RoundRobin和消除?

提前致谢

2 个答案:

答案 0 :(得分:0)

也许你应该只有一个桌面锦标赛,列'亲切'。例如,如果kind = 0表示锦标赛是RoundRobin,如果kind = 1表示锦标赛是淘汰赛,如果kind = 2表示锦标赛是淘汰赛和RoundRobin。

答案 1 :(得分:0)

编辑:由于你没有挖掘STI,另一种选择是有两种类型的锦标赛(循环赛和淘汰赛都属于锦标赛。

所以在那种情况下:

class Tournament < ActiveRecord:Base
 has_many :matches
 #attributes specific to any type of tournament: name, date, etc.
end

class RoundRobin < ActiveRecord:Base
  belongs_to :tournament

  #adds attributes specific to round robin tournaments
end
#etc
class Elimination < ActiveRecord:Base
  belongs_to :tournament
  #has attributes specific to elimination tournaments
end

class Match 
   belongs_to :tournament
end

所以如果你有一个round_robin锦标赛,它可以从锦标赛中获得所有基本的东西:

round_robin = RoundRobin.find(1)
#get tourney name
puts round_robin.tournament.name
puts round_robin.tournament.match.team_one_name #allowing you to access the match as well...

如果你想要你,那么可以在锦标赛上有一个名为type的属性(让你知道它是哪一个)。在rails中,这些传统上是字符串。但在其他语言中,我们通常使用带有外键的lookup_tables。

#to find all round_robins
tournaments = Tournament.find_by_type("round_robin")

tournmaments.each do |tourney|
  round_robin = RoundRobin.find_by_tournament_id(tourney.id)
end
#there are actually a bunch of different ways to query these:
round_robins = RoundRobin.all
tournaments = Tournament.joins(:round_robin).where("tournament_date > ?", date_lookup)
etc...