管理模型中的多个foreign_key

时间:2011-06-18 16:04:12

标签: ruby-on-rails activerecord associations

我正在努力在Rails中建立模型之间的良好模式/关联,并希望得到一些建议。 “玩家”有多个“选择”,每个“选择”由三个“骑手”组成,有序。

总结架构:

create_table players do |t|
  t.string "name"
  ...
end

create_table picks do |t|
  t.integer "player_id"
  t.integer "rider1_id"
  t.integer "rider2_id"
  t.integer "rider3_id"
  ...
end

create_table riders do |t|
  t.string "name"
  ...
end

我建立了模型之间的一些关联:

player.rb:
class Player < ActiveRecord::Base
  has_many :picks
end

pick.rb:
class Pick < ActiveRecord::Base
  has_many :riders, :foreign_key => "rider1_id"
  has_many :riders, :foreign_key => "rider2_id"
  has_many :riders, :foreign_key => "rider3_id"
  belongs_to :player
end

rider.rb
class Rider < ActiveRecord::Base
  belongs_to :pick
end

我觉得/我知道我在上面的代码中缺少对关联的一些基本理解。特别是,我希望能够说出类似:“myPick.rider1.name”。我也可以看看哪些选秀权包括一个给定的骑手,比如“myRider.picks”(虽然我不确定这是否可行)。从根本上说,我不确定在挑选模型中有三个“骑手”外键是正确的想法。

提前感谢任何建议。 干杯, 雅克

1 个答案:

答案 0 :(得分:1)

你的关联有点倒退了。表中没有外键belongs_to的表。因此,您应该有3 belongs_to :rider1, :class => 'Rider'次来电代替这些has_many来电。

# player.rb:
class Player < ActiveRecord::Base
  has_many :picks
end

# pick.rb:
class Pick < ActiveRecord::Base
  belongs_to :rider1, :class => 'Rider'
  belongs_to :rider2, :class => 'Rider'
  belongs_to :rider3, :class => 'Rider'
  belongs_to :player

  def riders
    # returns an array so you can say pick.riders.each { |rider| ... }
    # but it doesn't give you an ActiveRecord::AssociationProxy so you cannot 
    # do things like pick.riders.where(:condition => true)
    [rider1, rider2, rider3]
  end
end

# rider.rb
class Rider < ActiveRecord::Base
  has_one :pick
end

这仍然不会像执行has_many :riders一样干净,并且对每个选秀权的骑手数量施加限制(使用预期的内置关系)。