Ruby on rails 管理多个外键输入模型
我正在努力在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
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
方法,能够从一个数组中操纵所有的骑士。非常感谢!