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