如何根据属性值建立模型之间的关系?

时间:2014-10-12 04:39:57

标签: ruby-on-rails ruby-on-rails-4 associations rails-activerecord

我有以下三种型号......

播放器

id:integer
first_name:string
last_name:string

学校

id:integer
short_name:string
long_name:string

SchoolRosterSlot

id:integer
season:integer
jersey:string
position:string
active:boolean

最初我打算在球员模型上存放球衣,位置,school_id。但是,我改变了这一点,因为我认为将这些信息输入播放器模型是多余的,并且还将它插入到SchoolRosterSlot模型中,因为我想要在播放器上存储季节信息。 (球员的位置,球衣和学校都可以从赛季到季节变化)。

我的问题是如何设置我的关联,以便我可以通过@player.school访问玩家的学校?或者@player.jersey ......或者最好是在学校和玩家之间建立直接关联,并且只是插入名册槽记录,即使这会记录两次信息?

1 个答案:

答案 0 :(得分:1)

通常,您希望尽可能避免存储重复信息。

您可以尝试将school_roster_slot_id添加到播放器,将school_id添加到SchoolRosterSlot,然后将其添加到模型中:

class SchoolRosterSlot
  belongs_to :school
end

class Player
  belongs_to :school_roster_slot
  has_one :school, through: :school_roster:slot
end

这将创建一个player.school方法。如果您还希望获得player.jerseyplayer.position,也可以将其添加到播放器:

delegate :position, :jersey, to :school_roster_slot

这实际上与创建以下两种方法相同:

def jersey
  school_roster_slot.jersey
end

def position
  school_roster_slot.position
end

我不知道您是否想要存储有关球员位置和球衣的历史信息(例如,当球员改变位置和球衣时,您是否仍想存储有关其旧位置的信息?),但如果是这种情况,您可能需要执行类似于创建位于SeasonPlayer之间的名为SchoolRosterSlot的其他模型。或者您可以将start_dateend_date添加到SchoolRosterSlot以表示玩家何时开始并离开该位置?