Ruby-on-Rails:验证子对象的唯一性(或数量)

时间:2010-01-12 15:40:25

标签: ruby-on-rails validation parent-child

我有一个Game模型has_many :piles。事实上,我知道每个游戏都有4个堆,每个堆都有不同的(在游戏范围内)contents。我创建游戏的网页表单允许用户选择四个内容(如c_type_#)。因此,我可以在创建游戏时填充桩。但是,我无法弄清楚如何确保我有4个独特的桩。我的模型看起来像这样:

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

...我添加Piles的迁移看起来像:

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

...但所有这些意味着非独特的Piles没有被静默地添加到数据库中;并且父游戏最终只有不到4堆。

我目前通过游戏validate :unique_pile_contents, :on => :create解决了这个问题,其中unique_pile_contents验证了c_type_#值的uniq'd数组的长度是4 - 但这感觉非常糟糕。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我设法解决了这个问题,这是我正在处理的另一个问题的一部分。请参阅Creating a set number of child objects from a parent's form了解答案(以及问题中稍微简单的示例)。