我是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模型中完成此操作?我是否必须在验证中自行执行检查?
答案 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 n
和has 1
之间更加一致。