2010-01-15 7 views
0

Je développe un serveur de jeu de cartes, pour un jeu où chaque joueur a un deck et une pile de défausse. Pour tenir compte du fait qu'une carte donnée pourrait se trouver dans le deck d'un joueur ou leur défausse, j'ai mon modèle de joueur mis en place comme suit:Ruby on Rails: plusieurs directives acts_as_list pour la même paire parent-enfant

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 

Est-il possible de définir mon modèle Card de telle sorte que Je peux l'avoir acts_as_list avec chaque carte dans exactement une liste (soit le pont ou le défausser pour un seul joueur)?

Répondre

1

Votre problème n'est pas une validation, c'est plus que acts_as_list n'autorise pas plus que la liste sur une seule relation belongs_to. Cette validation suivante fera en sorte qu'une carte soit dans la liste de défausse ou de deck d'un joueur, mais pas dans les deux.

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

Vous devriez pouvoir utiliser STI pour atteindre les multiples listes que vous désirez. Note: ceci n'est pas testé mais devrait au moins vous mettre sur la bonne voie.

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

Ce n'est pas ce que je cherche (je pense). Je veux que la carte utilise acts_as_list à la portée du joueur, que ce soit pour le deck ou pour le jeter. ... Je pense. Hmm. Cela va-t-il rendre difficile, disons, de déplacer des cartes du haut du paquet vers le haut de la défausse? – Chowlett

+0

La validation garantit qu'une carte figure dans une seule liste. Cependant, je n'étais pas familier avec acts_as_list. La source du plugin ne suggère pas que vous pouvez définir deux listes sur la même relation belongs_to. La solution a été mise à jour pour refléter cela. – EmFi

+0

J'aime ça - donc je vais Up it - mais malheureusement, cela ne m'aide pas. Mes cartes sont de types différents, donc j'utilise déjà STI pour les distinguer. Si rien ne se passe mieux, j'accepterai aussi cela dans quelques jours. – Chowlett