一对一的DataMapper关联

时间:2013-06-11 18:13:08

标签: ruby datamapper ruby-datamapper

我是DataMapper的新手,我正在尝试为以下场景创建模型:

我有很多用户(使用用户名,密码等),他们也可以是玩家或裁判,或两者兼而有(因此不能选择单表继承)。基础模型将是:

class User
  include DataMapper::Resource
  property :id, Serial
  # Other user properties go here  
end

class Player
  include DataMapper::Resource
  property :id, Serial
  # Other player properties go here
  # Some kind of association goes here
end

class Referee
  include DataMapper::Resource
  property :id, Serial
  # Other referee properties go here
  # Some kind of association goes here
end

DataMapper.finalize
但是,我不确定添加到播放器和裁判的关联类型。使用belongs_to :user,多个玩家可以与同一个用户关联,这在我的上下文中没有意义。在RDBMS术语中,我想我想要的是对玩家和裁判员表中的外键的唯一约束。

如何在DataMapper模型中完成此操作?我是否必须在验证中自行执行检查?

2 个答案:

答案 0 :(得分:5)

有不同的方法可以做到这一点。这是一个选项:

class User
  include DataMapper::Resource
  property :id, Serial
  # Other properties...
  has 1, :referee, :required => false
  has 1, :player, :required => false
end

class Referee
  include DataMapper::Resource
  # DON'T include "property :id, Serial" here
  # Other properties...
  belongs_to :user, :key => true
end
class Player
  include DataMapper::Resource
  # DON'T include "property :id, Serial" here
  # Other properties...
  belongs_to :user, :key => true
end

对裁判/球员模特采取行动,如:

u = User.create(...)
u.referee = Referee.create(...)
u.player = Player.create(...)

u.player.kick_ball() # or whatever you want to call
u.player.homeruns
u.referee.flag_play() # or whatever.

看看这是否有效。我实际上没有测试它,但它应该是好的。

答案 1 :(得分:0)

:required => false属性无法识别has 1以外的其他答案。

这也令人困惑,因为对于has n属性,您可以在属性上使用new或以其他方式将其视为集合。在您的示例中,您可能会想要编码

u = User.create ...
u.referee.create ...

但是在has 1的情况下失败了,因为该属性是单个值,其开始时间为nil,因此您必须使用前一个答案所指示的方法。此外,必须明确地将belongs_to关联放入密钥中有点令人困惑。

它似乎执行验证并具有正确的关联操作(因此u.save也将保存引用的Referee)。我只是希望has nhas 1之间更加一致。