【问题标题】:Datamapper has n relationship with multiple keysDatamapper 与多个键有 n 关系
【发布时间】:2010-03-23 12:45:29
【问题描述】:

我正在与 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

【问题讨论】:

    标签: ruby datamapper


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      您是否尝试过以下方法:

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

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

      【讨论】:

      • 我认为 :through => Resource 将在对象上创建一个关联表和一个数组。我希望我可以保留单个字段,但我想您总是可以创建访问器或稍微更改对象模型。
      【解决方案3】:

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

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

      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
      

      【讨论】:

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