代码之家  ›  专栏  ›  技术社区  ›  Chowlett

Ruby on Rails:创建子对象

  •  10
  • Chowlett  · 技术社区  · 14 年前

    我相信这是个很简单的问题,但我只是个新手,所以…

    我有一个模型,游戏,它 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 激活时录制 知道 该游戏是外键,应指父游戏。但如果我把它关掉,这把外国钥匙就没了。有更好的方法吗?

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

    3 回复  |  直到 14 年前
        1
  •  14
  •   mxgrn    14 年前

    而不是:

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

    尝试:

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

    它试图直接保存创建的堆。或者,如果你 真正地 需要不发生储蓄(这种情况下 create 你可以这样做:

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

    类似于桩类及其卡片。

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

    create_monkey("some_attr" => "some_value")
    
        2
  •  3
  •   John Topley Damien MATHIEU    14 年前

    你的 Game 对象的 piles 关联集合将 build create 活动记录提供的方法 创造 方法还保存关联的对象,假设它通过验证)。

    您应该能够这样做:

    def after_create
      1.upto(4) do |num|
        piles.create(:contents => "c_type_#{num}")
      end
    end
    
        3
  •  0
  •   kikito    14 年前

    除了别人说的以外,你还应该考虑看看这个 week's railscast -它处理Rails 2.3中的继承资源,特别是视图中的继承资源。

    下周一(2010-01-18)将出现第2部分。