管理模型中的多个外键

问题描述

| 我正在努力在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 \”(尽管我不确定这是否有可能)。从根本上说,我不确定在拣选模型中具有三个“搭便车”外键是否是正确的主意。 在此先感谢您的任何建议。 干杯, 雅克     

解决方法

        您的联想有点倒退。带外键“ 2”的表不带外键的表。因此,您应该有3个3个呼叫来代替4个呼叫。
# 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
这仍然不如进行ѭ6并强制限制每个选秀的骑手人数(使用预期的内置关系)那样干净。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...