2010-01-15 3 views
0

각 플레이어가 데크 및 버려진 더미를 가지고있는 게임을 위해 카드 게임 서버를 개발 중입니다. 주어진 카드가 플레이어의 덱 또는 폐기 더미에 위치 할 수 있다는 사실을 반영하기 위해, 나는 내 플레이어 모델을 설정 한 다음과 같이루비 온 레일즈 (Ruby on Rails) : 동일한 부모 - 자식 쌍에 대한 여러 acts_as_list 지시문

class Player < ActiveRecord::Base 
    belongs_to :game 

    has_many :deck_cards, :class_name => "Card", 
         :conditions => "location = 'deck'", 
         :order => "position", 
         :dependent => :delete_all 

    has_many :discard_cards, :class_name => "Card", 
          :conditions => "location = 'discard'", 
          :order => "position", 
          :dependent => :delete_all 
end 

이 같은 방법으로 내 Card 모델을 정의 할 수 있음 각 카드를 정확히 하나의 목록에 담아서 () (단일 플레이어의 경우 데크 또는 버려야 함)?

답변

1

문제가 유효성 검사가 아니므로 acts_as_list는 하나 이상의 belongs_to 관계에 대한 목록 이상을 허용하지 않습니다.

다음 유효성 확인을 통해 카드가 플레이어의 폐기 또는 덱 목록에 있지만 둘 다에있는 것은 아닙니다.

validates_uniqueness_of [:fields, :that, :uniquely, :describe, :a, :card], 
    :scope => [:player_id, :location] 

원하는 다중 목록을 얻으려면 STI를 사용할 수 있어야합니다. 참고 : 이것은 테스트되지 않았지만 최소한 올바른 방향으로 이동해야합니다.

class Card < ActiveRecord::Base 
    belongs_to :player 
    validates_uniqueness_of [:fields, :that, :uniquely, :describe, :a, :card], 
    :scope => [:player_id, :location] 
    set_inheritance_column :location 
end 

class DeckCard < Card 
    acts_as_list, :scope => :player 
end 

class DiscardCard < Card 
    acts_as_list, :scope => :player 
end 

class Player 
    belongs_to :game 
    has_many :deck_cards, :order => "position", 
         :dependent => :delete_all 

    has_many :discard_cards, :order => "position", 
          :dependent => :delete_all 
end 
+0

내가 무엇을 찾고 있는지 (내가 생각하는). 나는 카드가 갑판이나 버리기 위해 Player의 범위에서 acts_as_list를 사용하기를 원합니다. ... 내 생각 엔. 흠. 카드가 갑판 위에서 버려 질 때까지 이동하는 것이 어렵게 될까요? – Chowlett

+0

검증을 통해 카드가 하나의 목록에만 포함되도록 할 수 있습니다. 그러나 acts_as_list에 익숙하지 않았습니다. 플러그인의 소스는 동일한 belongs_to 관계에 대해 두 개의 목록을 정의 할 수 있다고 제안하지 않습니다. 이를 반영한 ​​솔루션이 업데이트되었습니다. – EmFi

+0

나는 이것을 좋아한다. 나는 위로 가려고한다. 그러나 슬프게도 그것은 나를 도와주지 않는다. 내 카드는 다른 유형으로 제공되므로 STI를 이미 사용하고 있습니다. 더 나은 것이 없으면 며칠 안에 이것을 받아 들일 것입니다. – Chowlett