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