2010-01-15 97 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模型我可以在每個卡片上只有一個列表(每個卡片可以是acts_as_list)(對於單個玩家可以是套牌或放棄)?

回答

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

不是我在找什麼(我認爲)。我希望卡牌在玩家範圍內使用acts_as_list,作爲套牌或放棄。 ......我想。嗯。比如說,將卡從甲板頂部移到丟棄頂部是否會很困難? – Chowlett 2010-01-15 16:34:37

+0

驗證可確保卡僅在一個列表中。但是我並不熟悉acts_as_list。插件的來源並不表明它可以在同一個belongs_to關係中定義兩個列表。解決方案已經更新以反映這一點。 – EmFi 2010-01-15 17:51:26

+0

我喜歡這個 - 所以我打算起來 - 但可悲的是它並沒有幫助我。我的卡片有不同的類型,所以我已經使用STI來區分這些卡片。如果沒有更好的事情發生,我也會在幾天內接受這個。 – Chowlett 2010-01-15 18:58:55