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

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

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

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

10
задан Chowlett 10 January 2010 в 19:25
поделиться

3 ответа

Вместо того, чтобы:

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

попробуйте:

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

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

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

, аналогично для класса Wace и его карт.

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

create_monkey("some_attr" => "some_value")
14
ответ дан 3 December 2019 в 21:21
поделиться
Коллекция ассоциаций

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

Вы должны иметь возможность сделать что-то подобное:

def after_create
  1.upto(4) do |num|
    piles.create(:contents => "c_type_#{num}")
  end
end
3
ответ дан 3 December 2019 в 21:21
поделиться

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

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

0
ответ дан 3 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: