Ruby-on-Rails: проверка уникальности (или количества) дочерних объектов - PullRequest
1 голос
/ 12 января 2010

У меня есть модель, 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, но это выглядит очень неуклюже. Есть ли лучший способ?

1 Ответ

1 голос
/ 22 января 2010

Мне удалось решить это как часть другой проблемы, с которой я столкнулся. См. Создание заданного количества дочерних объектов из родительской формы для ответа (и немного более простой пример в вопросе).

...