2010-01-10 26 views
10

Estoy seguro de que esta es una pregunta muy simple, pero yo sólo soy un novato así que ...Ruby on Rails: La creación de los objetos secundarios

tengo un modelo, juego, que has_many :piles. Pila, a su vez, has_many :cards. Soy capaz de llenar las pilas y tarjetas en la creación del juego, por lo que mi código en la actualidad se ve algo como:

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 

Ahora bien, esto está muy bien, pero se siente mal estar pasando "game_id" => id cuando ActiveRecord sabe que game_id es la clave externa y debe referirse al juego principal. Pero si lo dejo, la clave externa termina desarmada. ¿Hay una mejor manera de hacer esto?

(Para un bono, probablemente más simple, se trata; supongamos juego también has_one :monkey Como mejor puedo crear el mono dentro del modelo de juego.?)

Respuesta

14

En lugar de:

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

intento:

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

Trata de guardar la pila creada de inmediato. O bien, si realmente necesita que ningún ahorro tiene lugar (que es el caso de create), que puede hacer:

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

similares para la clase Pila y sus cartas.

En cuanto a has_one :monkey, puede hacer lo siguiente (desde el interior de un método de juego):

create_monkey("some_attr" => "some_value") 
3

piles colección asociación Su Game del objeto tendrá build y create métodos proporcionados por la create método también Active Record (guarda el objeto asociado asumiendo que pasa la validación).

Usted debe ser capaz de hacer algo como esto:

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

Además de lo que los otros han dicho, se debe considerar que vieron este week's railscast - que se ocupa de los recursos heredados en Rails 2.3, específicamente en las vistas.

La parte 2 debería aparecer el próximo lunes (2010-01-18)