2

我正在与 DataMapper 建立简单的关系,DataMapper 是一个用于跟踪游戏的 ruby​​ 网络应用程序。一个游戏属于_4个玩家,每个玩家可以有很多游戏。当我调用 player.games.size 时,我似乎得到了 0 的结果,因为我知道有与他们相关的游戏的玩家。我目前能够将玩家关联从游戏中拉出来,但无法弄清楚为什么 player.games 是空的。我是否需要在 has n 关联上定义 parent_key,还是我还缺少其他东西?

class Game
  belongs_to :t1_p1, :class_name => 'Player', :child_key => [:player1_id]
  belongs_to :t1_p2, :class_name => 'Player', :child_key => [:player2_id]
  belongs_to :t2_p1, :class_name => 'Player', :child_key => [:player3_id]
  belongs_to :t2_p2, :class_name => 'Player', :child_key => [:player4_id]
  ...
end

class Player
  has n, :games
  ...
end
4

3 回答 3

1

仍然没有找到一种感觉正确的方法,但现在我正在使用以下解决方法。有谁知道更好的方法来实现这一点?

class Player
  has n, :games # accessor doesn't really function...
  def games_played
    Game.all(:conditions => ["player1_id=? or player2_id=? or player3_id=? or player4_id=?", id, id, id, id])
  end
end
于 2010-03-25T03:07:48.233 回答
1

您是否尝试过以下方法:

class Game
  has n, :Players, :through => Resource
end

class Player
  has n, :Games, :through => Resource
end

我现在正在寻找一个相关的错误。

于 2010-07-07T01:09:12.833 回答
0

您应该能够使用单表继承来实现所需的结果。尽管您可能需要考虑如何处理在一场比赛中成为玩家一号而在另一场比赛中成为玩家二号的玩家。

我的示例代码仅供参考。它尚未经过测试,但应该可以工作。

class Player
    property :id,             Serial
    property :name,           String
    property :player_number,  Discriminator
end

class PlayerOne < Player
  has n, :games, :child_key => [ :player1_id ]
end

class PlayerTwo < Player
  has n, :games, :child_key => [ :player2_id ]
end

class PlayerThree < Player
  has n, :games, :child_key => [ :player3_id ]
end

class PlayerFour < Player
  has n, :games, :child_key => [ :player4_id ]
end

class Game
  belongs_to :player1, :class_name => 'PlayerOne',    :child_key => [:player1_id]
  belongs_to :player2, :class_name => 'PlayerTwo',    :child_key => [:player2_id]
  belongs_to :player1, :class_name => 'PlayerThree',  :child_key => [:player3_id]
  belongs_to :player2, :class_name => 'PlayerFour',   :child_key => [:player4_id]
end
于 2011-01-19T15:16:55.187 回答