Ruby on rails 管理多个外键输入模型

Ruby on rails 管理多个外键输入模型,ruby-on-rails,activerecord,associations,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 "r

我正在努力在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
player.rb:
类播放器“骑手1\u id”
有很多:骑手,:外国骑手=>“骑手2\u id”
有很多:骑手,:外国骑手=>“骑手3\u id”
属于:玩家
结束
rider.rb
类附加程序
我觉得/知道我对上述代码中的关联缺少一些基本的理解。特别是,我希望能够说:“myPick.rider1.name”。我还可以查看哪些选秀包括给定的骑手,如“Myrieder.picks”(尽管我不确定这是否可能)。从根本上说,我不确定在pick模型中使用三个“rider”外键是否正确

提前感谢您的建议。 干杯
雅克

你的交往有点倒退。带外键的表属于不带外键的表。因此,您应该有3个
属于:rider1,:class=>“Rider”
调用来代替那些
有许多
调用的调用

# 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
#player.rb:
类播放器“骑士”
属于:骑手2,:class=>“骑手”
属于:骑士3,:class=>“骑士”
属于:玩家
def驾驶员
#返回一个数组,这样您就可以说pick.riders.each{| rider |…}
#但是它没有给你一个ActiveRecord::AssociationProxy,所以你不能
#执行诸如pick.riders.where(:condition=>true)之类的操作
[rider1,rider2,rider3]
结束
结束
#rider.rb
类附加程序

这还不如做一个有很多:车手的
,并对每个选择的车手数量实施限制(使用预期的内置关系)那么干净。

是的,这是有道理的。谢谢,谢谢。基本上,我对
所属的
的语法是错误的。我不得不稍微修改您上面所写的内容(可能是因为我仍然在使用Rails 2-legacy项目),但我使用它:
属于:rider1,:class\u name=>'Rider',:foreign\u key=>:rider1\u id
。我也非常喜欢
riders
方法,能够从一个数组中操纵所有的骑士。非常感谢!