2010-01-15 59 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