如何在不设置直接belongs_to的情况下设置一种"belongs_to:through"?

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

  • 这很优雅,但您需要对对象树中的每个级别执行一次查询.因此,如果您只需要顶级对象,则可以将其打包在一个SQL查询中.将会有后续的查询,但仍然只有一个转移`rails - (查询) - >数据库 - (结果) - > rails`.不幸的是我不知道用rails查询界面做热.有谁知道? (5认同)
  • 我很有意思!<满足评论长度限制的文本> (2认同)

小智 8

你可以试试

    class Player
      belongs_to :team
      has_one :division, :through => :team
    end

  • 我同意你的看法 - 对于Rails的当前状态.但我想知道为什么没有belongs_to:通过. (3认同)
  • 不,你不应该这样做.has_one关系通过外键建议另一个模型中的belongs_to关系.但是`Division`不是'belongs_to:team`,它`has_many:teams`,这意味着团队`belongs_to:division`.Matt Smith做对了:你也可以在Player类中使用这个逻辑:`delegate:division,:to =>:team`. (2认同)
  • 哦哦!这适用于最少数量的查询.我认为应该有`belongs_to:through`!此外,您的解决方案缓存`division`查询的结果. (2认同)
  • @JaapHaagmans `has_one :through` 在这里实际上是正确的,据我所知。`has_one` 只是 Rails 术语,表示 1:1 关联,其中该模型没有外键字段——这里的确切情况。在这方面,“部门属于 :team”这一事实无关紧要。 (2认同)

emr*_*ass 7

您可以在播放器模型中定义辅助方法:

def division
  team.division
end

def league
  team.division.league
end
Run Code Online (Sandbox Code Playgroud)

当然,这只涉及代码的可读性,并不影响所涉及的数据库查询的形式.如果您的语句生成多个SQL查询但只需要一个,请查看.include此处的选项:Rails指南 - 活动记录查询接口