2010-01-12 76 views
1

我有一個模型,Game,其中has_many :piles。事實上,我知道每個遊戲都有4堆,每個遊戲都有不同的(在遊戲範圍內)contents。我用於創建遊戲的網絡表單允許用戶選擇四個內容(如c_type_#)。因此,我可以在創建遊戲時填充樁。但是,我無法弄清楚如何確保我有4個獨特的樁。我的模型是這樣的:Ruby-on-Rails:驗證子對象的唯一性(或數量)

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 

...和我的移民加樁的樣子:

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 

......但所有這意味着,非唯一樁不添加到數據庫,默默地;父母比賽最終只有不到4堆。

我現在已經解決這個具有遊戲validate :unique_pile_contents, :on => :create,其中unique_pile_contents驗證c_type_#值的uniq'd數組的長度是4的工作 - 但這種感覺很缺憾。有沒有更好的辦法?

回答