2013-06-11 4 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을 사용하면 여러 사용자를 동일한 사용자와 연결할 수 있습니다. 이는 내 맥락에서 이해가되지 않습니다. RDBMS에서 필자가 원하는 것은 Players와 Referees 테이블의 외래 키에 대한 고유 한 제약 조건입니다.

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 알겠습니다. 그것을 방지하기 위해 편집 됨. 이제 "서브 클래스"는 User 외래 키를 기본 키로 사용합니다. – AlexQueue

+0

이것은 DataMapper에서 올바른 1 대 1 연관 관계가있는 것처럼 보입니다. 평판의 도움을 누리십시오 :-) – mwittrock

0

has 1 속성에 대해 이전 답변이 :required => false이 아닌 것으로 인식됩니다.

has n 속성의 경우 속성에 new을 사용하거나 그렇지 않으면 컬렉션으로 처리 할 수 ​​있기 때문에 혼란 스럽습니다. 귀하의 예제에서는

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

를 코딩하는 유혹 할 것이다 그러나 속성이 nil 삶을 시작하고 그래서 당신은 이전의 대답은 표시 방법을 사용해야 하나의 값이기 때문에 그 has 1의 경우 실패 . 또한 명시 적으로 belongs_to을 키와 연결해야하는 것은 다소 혼란 스럽습니다.

유효성 검사를 실행하고 올바른 연결 작업이있는 것 같습니다 (따라서 u.save는 참조 된 Referee도 저장합니다). 단지 has nhas 1 사이의 일관성을 유지하기 바란다.