Ruby on Rails: создание дочерних объектов - PullRequest
10 голосов
/ 10 января 2010

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

У меня есть модель Game, которая has_many :piles. Куча, в свою очередь, has_many :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?)

Ответы [ 3 ]

14 голосов
/ 10 января 2010

Вместо:

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")
3 голосов
/ 10 января 2010

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

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

def after_create
  1.upto(4) do |num|
    piles.create(:contents => "c_type_#{num}")
  end
end
0 голосов
/ 11 января 2010

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

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

...