Datamapper имеет n отношений с несколькими ключами - PullRequest
2 голосов
/ 23 марта 2010

Я работаю над простыми отношениями с DataMapper, веб-приложением ruby ​​для отслеживания игр. Игра принадлежит 4 игрокам, и у каждого игрока может быть много игр. Когда я звоню player.games.size, мне кажется, что я получаю результат 0, потому что игрокам, с которыми я знаю, игры связаны с ними. В настоящее время я могу вывести ассоциации игроков из игры, но не могу понять, почему player.games пуст. Нужно ли указывать parent_key для ассоциации 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

Ответы [ 3 ]

1 голос
/ 07 июля 2010

Вы пробовали следующее:

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

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

Сейчас я ищу связанную ошибку.

1 голос
/ 25 марта 2010

До сих пор не нашли способ, который кажется правильным, но сейчас я использую следующий обходной путь. Кто-нибудь знает лучший способ сделать это?

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
0 голосов
/ 19 января 2011

Вы должны иметь возможность использовать наследование одной таблицы для достижения желаемого результата. Хотя вам, возможно, понадобится подумать о том, как вы относитесь к игрокам, которые являются Игроком Один в одной игре и Игроком Два в другой.

Мой пример кода только для справки. Он не был проверен, но должен работать.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...