I'm sure this is a very simple question, but I'm just a newbie so...
I have a model, Game, which has_many :piles. Pile, in turn, has_many :cards. I'm able to populate the Piles and Cards at creation of the Game, so my code at present looks something like:
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
Now this is all very well, but it feels wrong to be passing "game_id" => id when ActiveRecord knows that game_id is the foreign key and should refer to the parent game. But if I leave it off, the foreign key ends up unset. Is there a better way to do this?
(For a bonus, probably simpler, question; suppose Game also has_one :monkey. How best do I create the monkey from within the Game model?)
Instead of:
Pile.new("game_id" => id, "contents" => "c_type_#{num}")
try:
piles.create("contents" => "c_type_#{num}")
It tries saving the created pile straight away. Or, if you really need that no saving takes place (which is the case with create), you can do:
new_pile = piles.build("contents" => "c_type_#{num}")
Similar for the Pile class and its cards.
As for has_one :monkey, you can do the following (from within a method of Game):
create_monkey("some_attr" => "some_value")
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With