【问题标题】:has_many through relationship with an intervening modelhas_many 通过与介入模型的关系
【发布时间】:2013-06-11 11:50:57
【问题描述】:

Rails 新手,并尝试找出最“有条理”的方式来实现以下内容。

如下:

class Team
  has_many :team_memberships
  has_many :players, through: :team_memberships
end

class TeamMembership
  acts_as_list scope: :team_id
  belongs_to :team
  belongs_to :player
end

class Player
  has_many :team_memberships
  has_many :teams, through: team_memberships
end

在我的 TeamMembership 模型中,我还有一个额外的列 position:integer、captain:boolean 和 wicket_keeper:boolean(你能告诉我我在做什么吗.. :))

鉴于以下情况:

t = Team.first
p = Player.first(11)
t.players << p

这很好地用我的玩家对象填充了 TeamMembership 模型。

如果我尝试:

t.players[4][:captain] = true

它失败了 - ActiveModel::MissingAttributeError: can't write unknown attributecaptain'`

不过,我可以这样设置:

t.team_memberships[4][:captain] = true

但这感觉不对。

鉴于您应该看到我想要实现的目标,是这样的:

A) 完成这项任务的最佳方法 - 如果是这样,有没有办法直接通过玩家获取并设置队长属性(如果有意义的话)

或

B) 有没有更好、更“有条理”的方法我错过了。

【问题讨论】:

    标签: ruby-on-rails activerecord has-many-through


    【解决方案1】:

    我相信您所拥有的 t.team_memberships[4][:captain] = true 是正确的。我这样说是因为您在问题中声明您的 TeamMembership 模型具有position:integer、captain:boolean、wicket_keeper:boolean。因此,据我了解,您已经填充了 TeamMembership 模型。但是使用以下内容:t.players[4][:captain] = true 您正在尝试访问船长属性。这是 TeamMembership 模型的一部分,所以我想说的是你试图访问属性 captain 实例的属性 TeamMembership 。除此之外,我相信这个错误来自你在 Player 类中的has_many :team_memberships,它指的是关联的模型。我认为它在 TeamMembership 表中寻找 player_id。请参阅以下链接,它们可能有助于阐明您要执行的操作:

    API - Ruby on Rails - belongs_to

    Guide Ruby on Rails - Belongs_to_association-reference 看看第 4.1.2.6 节:foreign_key

    【讨论】:

    • 感谢您的回答 - 但是,我知道为什么通过 team_memberships 建立的关联是有效的 - 我希望有更好的方法来定义团队玩家关系...会阅读链接,虽然我已经通过它们几次了!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多