我有以下三种型号......
播放器
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
......或者最好是在学校和玩家之间建立直接关联,并且只是插入名册槽记录,即使这会记录两次信息?
答案 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.jersey
和player.position
,也可以将其添加到播放器:
delegate :position, :jersey, to :school_roster_slot
这实际上与创建以下两种方法相同:
def jersey
school_roster_slot.jersey
end
def position
school_roster_slot.position
end
我不知道您是否想要存储有关球员位置和球衣的历史信息(例如,当球员改变位置和球衣时,您是否仍想存储有关其旧位置的信息?),但如果是这种情况,您可能需要执行类似于创建位于Season
和Player
之间的名为SchoolRosterSlot
的其他模型。或者您可以将start_date
和end_date
添加到SchoolRosterSlot
以表示玩家何时开始并离开该位置?