2013-06-11 2 views
2

Я очень новый для DataMapper, и я пытаюсь создать модели для следующего сценария:один-к-одному 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 несколько игроков могут быть связаны с одним и тем же пользователем, что не имеет смысла в моем контексте. В терминах СУРБД я предполагаю, что я хочу, это уникальное ограничение на внешний ключ в таблицах «Игроки» и «Рефери».

Как это сделать в моей модели DataMapper? Нужно ли мне проверять себя на проверку?

ответ

5

Существуют различные способы, которыми вы могли бы это сделать. Вот один вариант:

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. 

Смотрите, если это работает. Я на самом деле не проверял его, но это должно быть хорошо.

+0

Спасибо за ваш ответ. Тем не менее, эти модели позволяют мне создавать несколько игроков, которые связаны с одним и тем же пользователем. – mwittrock

+0

@mwittrock Я вижу. Отредактировано для предотвращения этого. Теперь «подклассы» используют внешний ключ пользователя в качестве основного ключа. – AlexQueue

+0

Это, кажется, правильная ассоциация «один-на-один-один» в DataMapper. Наслаждайтесь поддержкой репутации :-) – mwittrock

0

Предыдущие ответы, кроме :required => false, не признаны за has 1.

Это также сбивает с толку, потому что для has n объектов недвижимости вы можете использовать new прямо на объекте недвижимости или иным образом относиться к нему как к коллекции. В вашем примере, вы бы соблазн код

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

Но это терпит неудачу в случае has 1, поскольку свойство одно значение, которое начинается жизнь как nil и поэтому вы должны использовать метод предыдущий ответ указывает , Кроме того, необходимость явно сделать ассоциацию belongs_to в ключе немного запутанной.

Он, похоже, выполняет проверки и имеет правильные действия ассоциации (так что u.save также сохранит упомянутый Referee). Я просто хочу, чтобы он был более последовательным между has n и has 1.