【问题标题】:One-to-one DataMapper association一对一 DataMapper 关联
【发布时间】:2013-06-07 16:52:32
【问题描述】:

我是 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 术语中,我想我想要的是对 Players 和 Referees 表中外键的唯一约束。

如何在我的 DataMapper 模型中实现这一点?我是否必须在验证中自己执行检查?

【问题讨论】:

    标签: ruby datamapper ruby-datamapper


    【解决方案1】:

    您可以通过不同的方式来做到这一点。这是一种选择:

    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.
    

    看看这是否有效。我还没有实际测试过,但应该不错。

    【讨论】:

    • 感谢您的回答。不过,这些模型仍然允许我创建与同一用户关联的多个播放器。
    • @mwittrock 我明白了。编辑以防止这种情况。现在“子类”使用 User 外键作为主键。
    • 这似乎是 DataMapper 中正确的一对一关联。享受声誉的帮助:-)
    • 哦,赏金可以在 6 小时内获得。
    【解决方案2】:

    has 1 属性无法识别除 :required => false 之外的上一个答案。

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

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

    但是在has 1 的情况下失败了,因为该属性是单个值,它以nil 开始生命,因此您必须使用前面答案指示的方法。此外,必须将 belongs_to 关联显式设为键有点令人困惑。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多