Ruby on Rails: создание дочерних объектов

Я уверен, что это очень простой вопрос, но я просто новичок, поэтому...

У меня есть модель, игра, которая has_many :piles. Куча, в свою очередь, has_many :cards. Я могу заполнить Piles и Cards при создании игры, поэтому мой код в настоящее время выглядит примерно так:

class Game < ActiveRecord::Base
  has_many :piles

  def after_create
    1.upto(4) do |num|
      Pile.new("game_id" => id, "contents" => "c_type_#{num}")
    end
  end
end

class Pile < ActiveRecord::Base
  has_many :cards
  belongs_to :game

  def after_create
    1.upto(10) do |num|
      Card.new("pile_id" => id, "value" => num)
    end
  end
end

class Card < ActiveRecord::Base
  belongs_to :pile
end

Теперь все очень хорошо, но мне нехорошо проходить через "game_id" => id, когда ActiveRecord знает, что game_id является внешним ключом и должен ссылаться на родительскую игру. Но если я оставлю это, внешний ключ не будет отменен. Есть ли лучший способ сделать это?

(Для бонуса, возможно, более простого вопроса, предположим, что Game также has_one :monkey. Как лучше всего создать обезьяну из модели Game?)

Ответ 1

Вместо:

Pile.new("game_id" => id, "contents" => "c_type_#{num}")

попробовать:

piles.create("contents" => "c_type_#{num}")

Он пытается сохранить созданную кучу сразу. Или, если вам действительно нужно, чтобы сохранение не происходило (что имеет место с create), вы можете сделать:

new_pile = piles.build("contents" => "c_type_#{num}")

Аналогично для класса Pile и его карт.

Что касается has_one :monkey, вы можете сделать следующее (из метода Game):

create_monkey("some_attr" => "some_value")

Ответ 2

В вашей коллекции Game object piles будут установлены методы build и create, предоставленные Active Record (метод create также сохраняет связанный объект, предполагая, что он прошел проверку).

Вы должны сделать что-то вроде этого:

def after_create
  1.upto(4) do |num|
    piles.create(:contents => "c_type_#{num}")
  end
end

Ответ 3

В дополнение к тому, что говорили другие, вам следует рассмотреть возможность просмотра недельного railscast - который касается унаследованных ресурсов в Rails 2.3, в частности в представлениях.

Часть 2 должна появиться в следующий понедельник (2010-01-18)