我知道“belongs_to:through”是无效的,它只是我试图表达我想要达到的目标,只是忍受我一段时间......
这就是我得到的:
class League
has_many :divisions
end
class Division
belongs_to :league
has_many :teams
end
class Team
belongs_to :division
has_many :players
end
class Player
belongs_to :team
end
现在,为了制作“棒球卡”视图表格,我需要:
name
team.name
team.division.name
team.division.league.name
那么,有没有办法设置一个“belongs_to:through”直接从'players_controller'访问'division.name'而没有'team'。字首 ??我必须访问从“播放器”到“分区”的许多列,因此寻找一种方法来“直接”访问这些列。
一个选项是在'players'表中包含'division_id'列,但我被告知它会破坏关系数据模型,因为如果数据选择功能不正确会导致不一致处理(例如,玩家A在A组,在A组,但是玩家A的division_id列设置为B组。)
是否可以制作“符号链接”,例如'division'现在指'team.division','league'现在指的是'team.division.league'??
或者,每次使用完整路径是唯一真正的选择吗?
希望有人可以提供帮助。
BR, 纳斯
答案 0 :(得分:62)
在模型类中使用delegate。
class Team < ActiveRecord::Base
belongs_to :division
has_many :players
delegate :league, to: :division
end
参考:http://api.rubyonrails.org/classes/Module.html#method-i-delegate
答案 1 :(得分:8)
您可以尝试
class Player belongs_to :team has_one :division, :through => :team end
答案 2 :(得分:7)
您可以在播放器模型中定义辅助方法:
def division
team.division
end
def league
team.division.league
end
当然,这只涉及代码的可读性,并不影响所涉及的数据库查询的形式。如果您的语句生成多个SQL查询但只需要一个,请在此处查看.include
选项:Rails Guides - Active Record Query Interface