Ruby on Rails:创建子对象

Cho*_*ett 10 ruby ruby-on-rails foreign-keys parent-child

我确定这是一个非常简单的问题,但我只是一个新手所以......

我有一个模特,游戏,哪个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
Run Code Online (Sandbox Code Playgroud)

现在这一切都很好,但是"game_id" => id当ActiveRecord 知道 game_id是外键并且应该引用父游戏时传递感觉是错误的.但如果我把它关掉,那么外键最终会被取消.有一个更好的方法吗?

(对于奖金,可能更简单,问题;假设游戏也has_one :monkey.我最好如何在游戏模型中创建猴子?)

mxg*_*grn 14

代替:

Pile.new("game_id" => id, "contents" => "c_type_#{num}")
Run Code Online (Sandbox Code Playgroud)

尝试:

piles.create("contents" => "c_type_#{num}")
Run Code Online (Sandbox Code Playgroud)

它试图直接保存创建的桩.或者,如果您确实需要不进行保存(情况就是这样create),您可以:

new_pile = piles.build("contents" => "c_type_#{num}")
Run Code Online (Sandbox Code Playgroud)

类似于桩类及其卡片.

至于has_one :monkey,您可以执行以下操作(从游戏方法中):

create_monkey("some_attr" => "some_value")
Run Code Online (Sandbox Code Playgroud)