2010-01-12 12 views
1

J'ai un modèle, Game, qui has_many :piles. En fait, je sais que chaque jeu a exactement 4 piles, dont chacune a un différent (à la portée du jeu) contents. Mon formulaire Web pour créer un jeu permet à l'utilisateur de choisir les quatre contenus (comme c_type_ #). Je suis donc capable de peupler les Piles à la création du Jeu. Cependant, je ne peux pas comprendre comment m'assurer que j'ai exactement 4 piles uniques. Mes modèles ressemblent à ceci:Ruby-on-Rails: Validation de l'unicité (ou nombre) d'objets enfants

class Game < ActiveRecord::Base 
    has_many :piles 

    def after_create 
    1.upto(4) do |num| 
     piles.create("contents" => "c_type_#{num}") 
    end 
    end 
end 

class Pile < ActiveRecord::Base 
    belongs_to :game 
    validates_uniqueness_of :contents, :scope => "game_id" 
end 

... et ma migration pour ajouter des Piles ressemble:

class CreatePiles < ActiveRecord::Migration 
    def self.up 
    create_table :piles do |t| 
     t.integer :game_id 
     t.string :contents 
    end 

    add_index :piles, [:game_id, :contents], :unique => true 
    end 

    def self.down 
    drop_table :piles 
    end 
end 

... mais tout cela signifie que les Piles non uniques ne sont pas ajoutés à la base de données, en silence; et le jeu parent se termine avec moins de 4 piles.

J'ai actuellement travaillé autour de cela en ayant Game validate :unique_pile_contents, :on => :create, où unique_pile_contents vérifie que la longueur d'un tableau uniq'd des valeurs de c_type_ # est 4 - mais cela semble très kludgy. Y a-t-il un meilleur moyen?

Répondre