У меня есть модель, 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
... и моя миграция для добавления свай выглядит так:
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 кучами.
В настоящее время я работал над этим, имея Game validate :unique_pile_contents, :on => :create
, где unique_pile_contents
проверяет, что длина уникального массива значений c_type_ # равна 4, но это выглядит очень неуклюже. Есть ли лучший способ?