tutorial rails que español ejemplos ruby-on-rails migration

ruby on rails - que - Adición de una referencia del modelo al modelo existente de Rails



ruby on rails que es (3)

Me gustaría saber la forma "correcta" de aproximación agregando una relación entre dos clases existentes en Rails 3.

Dados los modelos existentes: payaso y conejo.

Me gustaría agregar una referencia (pertenece a) desde Rabbit to Clown. Empiezo intentando generar una migración:

rails g migration AddClownToRabbits clown:reference

Lo 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 de rake db:migrate migrate en esta migración, examino el desarrollo de SQLite3 y veo una nueva columna: "clown" reference

Supongo que esperaba una columna "clown_id" integer y una migración que se parecía 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: crea 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. 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.


No estoy seguro de dónde obtuvo esta idea, pero no hay (y nunca ha habido) tal sintaxis para hacer lo que quiere con add_column . Para obtener el comportamiento que deseas, deberías hacer t.refences :clown , como dijiste. En el fondo, esto llamará: @base.add_column(@table_name, "#{col}_id", :integer, options) .

Ver here

EDITAR:

Creo que puedo ver la fuente de tu confusión. Vio el método llamada 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, es simplemente el nombre de un método, similar a t.rename .


Si está utilizando rieles de borde (4.0) puede usar:

rails generate migration AddAddressRefToContacts address:references

Como se puede ver en los docs .


Una vez que haya establecido belongs_to en Rabbit y has_many en Clown, puede realizar una migración con:

add_column :rabbit, :clown_id, :integer