2010-12-02 13 views
25

Me gustaría saber la forma "correcta" para acercarse a la adición de una relación entre dos clases existentes en Rails 3.Adición de un modelo de referencia para los carriles existentes modelo

Dados los modelos existentes: payaso & conejo

Me gustaría agregar una referencia (belongs_to) de Rabbit to Clown. Comienzo por tratar de generar una migración:

rails g migration AddClownToRabbits clown:reference 

que me da una migración que se parece a:

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown, :reference 
    end 

    def self.down 
    remove_column :rabbits, :clown 
    end 
end 

Después rake db:migrate en esta migración examino development.db de SQLite3 y ver una nueva columna: "clown" reference

supongo que estaba esperando una columna "clown_id" integer y una migración que parecía:

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown_id 
    end 

    def self.down 
    remove_column :rabbits, :clown_id 
    end 
end 

Estoy seguro: se supone que la referencia es equivalente a "t.references: clown" pero no puedo encontrar la documentación (gran sorpresa). API dice add_column: Instantiates a new column for the table. The type parameter is normally one of the migrations native types, which is one of the following: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.

... sin referencia a: referencia.

+1

Para la documentación (si es una referencia en la documentación, si eso cuenta) consulte http://guides.rubyonrails.org/getting_started.html y desplácese hacia abajo hasta 7.1 Generar un modelo y ver el fragmento de código debajo de ese título . Verá que es *: referencias * en lugar de *: referencia *. – iconoclast

Respuesta

18

Después de configurar belongs_to de conejo, y has_many de payaso, se puede hacer una migración con:

add_column :rabbit, :clown_id, :integer 
+0

¡genial! ¡Gracias! Esperaba un poco ... ¿pero todavía estaba luchando con dónde poner eso ... en una migración 'desnuda'? entonces tal vez solo 'rails g migration AddClownToRabbits' y luego editar el resto a mano? – Meltemi

+0

que acabo de probar ahora ... y me da una pizarra en blanco con el nombre de archivo correcto con el nombre de la hora ... que puedo editar como mencionas. gracias – Meltemi

+1

Tengo la impresión de que el uso de "referencias" también agrega un índice a la columna, pero de esta manera necesitaría agregar: index => true. algo como esto \t \t add_reference: conejos,: payaso,: index => true – TheJKFever

5

No estoy seguro de dónde obtuvo esta idea, pero no existe (y nunca ha existido) dicha sintaxis para hacer lo que quiera con add_column. Para obtener el comportamiento que desea, debe hacer t.refences :clown, como indicó. En el fondo esto llamará: @base.add_column(@table_name, "#{col}_id", :integer, options).

Ver here.

EDIT:

creo que puedo ver la fuente de su confusión. Usted vio el método llamar al t.reference y asumió que era un tipo de datos porque existen llamadas como t.integer y t.string, y esos son tipos de datos. Eso está mal. La referencia no es un tipo de datos, simplemente es el nombre de un método, similar a t.rename.

+0

disculpa por la confusión ... aprendiendo ... y, bueno, así es como aprendes. ¡Gracias! Entonces, para responder a mi pregunta, ¿cuál es el comando generador correcto ... aún suponiendo que necesito comenzar con uno porque los generadores tienen marca de tiempo y no creo que deba crear el nombre de archivo a mano?!? 'rails g migration AddClownToRabbits clown: reference' me da la basura mala de arriba. – Meltemi

+0

@Meltemi: no hay un comando del generador para agregar referencias, solo columnas.Tenga en cuenta que todo lo que hace el generador es ... bueno ... generarse. No es gran cosa que no pueda agregar referencias, solo tienes que hacerlo tú mismo. – ryeguy

52

Si está utilizando canales del borde (4.0) que puede utilizar:

rails generate migration AddAddressRefToContacts address:references 

Como puede ver en el docs.

+2

Tan guay Paulo. Esto funciona. ¡Gracias! – Dru

+3

¡Finalmente! Eso faltaba desde Rails 2 –

+0

También podría usar 'address: belongs_to' si prefiere –

Cuestiones relacionadas