我正在努力在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”(虽然我不确定这是否可行)。从根本上说,我不确定在挑选模型中有三个“骑手”外键是正确的想法。
提前感谢任何建议。 干杯, 雅克
答案 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
一样干净,并且对每个选秀权的骑手数量施加限制(使用预期的内置关系)。