通过与介入模型的关系来实现

时间:2013-06-11 11:50:57

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

对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:integercaptain:booleanwicket_keeper:boolean(你能说出我在做什么......)。)

鉴于以下内容:

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

这会很好地使用我的播放器对象填充TeamMembership模型。

如果我尝试:

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

它失败了 - ActiveModel::MissingAttributeError: can't write unknown attribute队长'`

但是,我可以这样设置:

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

但这只是错了。

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

A)接近这项任务的最佳方式 - 如果是这样,有没有办法直接通过玩家获得并设置队长属性(如果这是有道理的)

B)我缺少一种更好,更“顽固”的方法。

1 个答案:

答案 0 :(得分:0)

我相信你所拥有的t.team_memberships[4][:captain] = true是正确的。我这样说是因为您在问题中声明您的 TeamMembership 模型有position:integercaptain:booleanwicket_keeper:boolean。因此,根据我的理解,您已经填充了 TeamMembership 模型。但是,使用以下内容:t.players[4][:captain] = true您正在尝试访问captain属性。哪个是 TeamMembership 模型的一部分,所以我想说的是您尝试访问属性队长哪个实例的属性 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