Jon*_*sen 33 activerecord ruby-on-rails
我知道"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
Run Code Online (Sandbox Code Playgroud)
现在,为了制作"棒球卡"视图表格,我需要:
name
team.name
team.division.name
team.division.league.name
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法设置"belongs_to:through"直接从'players_controller'访问'division.name'而没有'team'.字首 ??我必须从"播放器"到"分区"访问许多列,因此寻找一种方法来"直接"访问这些列.
一个选项是在'players'表中包含'division_id'列,但我被告知它会破坏关系数据模型,因为如果数据选择功能没有得到妥善处理,它将允许不一致(例如玩家A在A组,在A组,但是玩家A的division_id列设置为B组.
是否有可能形成一个"象征性的联系",例如"分裂"现在指的是'team.division','联盟'现在指的是'team.division.league'?
或者,每次使用完整路径是唯一真正的选择吗?
希望有人能提供帮助.
Br,Jonas
Mat*_*ith 62
在模型类中使用delegate.
class Team < ActiveRecord::Base
belongs_to :division
has_many :players
delegate :league, to: :division
end
Run Code Online (Sandbox Code Playgroud)
参考:http://api.rubyonrails.org/classes/Module.html#method-i-delegate
小智 8
你可以试试
class Player belongs_to :team has_one :division, :through => :team end
您可以在播放器模型中定义辅助方法:
def division
team.division
end
def league
team.division.league
end
Run Code Online (Sandbox Code Playgroud)
当然,这只涉及代码的可读性,并不影响所涉及的数据库查询的形式.如果您的语句生成多个SQL查询但只需要一个,请查看.include
此处的选项:Rails指南 - 活动记录查询接口