2010-03-23 93 views
2

我正在与DataMapper(一个用于跟踪游戏的ruby webapp)的简单关系。游戏属于4个玩家,每个玩家可以有很多游戏。 当我打电话给player.games.size时,我似乎得到了0的结果,对于我认识的玩家来说有与他们相关的游戏。我目前能够将玩家关联关闭,但不知道为什么player.games是空的。 我是否需要在has n关联中定义parent_key,还是还有其他我缺少的东西?Datamapper与多个键具有n关系

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 

回答

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 
1

你有没有试过如下:

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

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

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

+0

我认为:through =>资源会在对象上创建关联表和数组。我希望能保留单个字段,但我想你总是可以创建访问器或改变对象模型。 – jing 2010-07-13 14:33:20

0

您应该可以使用Single Table Inheritance来获得所需的结果。虽然您可能需要考虑如何处理玩家在一场比赛中是玩家一,玩家二在另一场比赛中。

我的示例代码仅供参考。它没有经过测试,但应该工作。

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