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?