我有一个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 - 但这感觉非常糟糕。还有更好的方法吗?
答案 0 :(得分:1)
我设法解决了这个问题,这是我正在处理的另一个问题的一部分。请参阅Creating a set number of child objects from a parent's form了解答案(以及问题中稍微简单的示例)。