through references rails includes has_many has_and_belongs_to_many foreign example belongs_to ruby-on-rails associations

ruby-on-rails - includes - rails model references



AsociaciĆ³n de rieles para dos claves externas para la misma tabla en una tabla (2)

Soy nuevo en RoR y sigo jugando con asociaciones. Necesito tener dos referencias a un modelo particular en otro modelo. El código de andamiaje no funciona y aparece un error de "constante sin inicializar".

Comandos de generación:

script/generate scaffold BaseModel name:string script/generate scaffold NewModel name:string base1:references base2:references db:migrate

Modelos generados:

class NewModel < ActiveRecord::Base belongs_to :base1 belongs_to :base2 end

y

class BaseModel < ActiveRecord::Base has_many :new_models # I added this line end

Cuando trato de crear un nuevo_modelo en /new_models/new , probé tanto el ID como el nombre del Modelo base pero no funciona. El error que recibo es:

uninitialized constant NewModel::Base1

Supuse que asignaba los nombres, así que en mi método de creación, intenté establecer explícitamente las instancias de BaseModel:

@new_model = NewModel.new(params[:new_model]) @base1 = BaseModel.find(1) # this exists @base2 = BaseModel.find(2) # this exists @new_model.base1 = @base1 # This throws the same error as above

¿Hay algo que me falta?


El símbolo pasado al método belongs_to debe ser el nombre singular del otro modelo. Entonces para tu ejemplo, sería:

class NewModel < ActiveRecord::Base belongs_to :base_model end


La mayor parte de la magia de Rails proviene de la convención sobre la configuración. Al nombrar las cosas de acuerdo con las pautas, Rails puede adivinar la mayoría de las opciones de configuración. ActiveRecord :: Las asociaciones no son excepciones.

El primer argumento de cualquier asociación ActiveRecord es el nombre que se utilizará dentro del modelo. Este suele ser el nombre de otro modelo, esa es la convención. Por defecto, el nombre de la clase es el singular del nombre de la asociación en camelcase. La clave foránea predeterminada en la asociación es el nombre de la asociación con "_id". Si el nombre de su asociación no coincide con un nombre de clase o una clave externa con estos patrones, deberá proporcionarlos como opciones.

Esto hará lo que quieras:

class NewModel belongs_to :base1, :class_name => "BaseModel" belongs_to :base2, :class_name => "BaseModel" end

Personalmente le daría a las asociaciones nombres más descriptivos que base1 y base2. Algo como esto:

Tabla de clasificaciones: id, rater_id, rated_id, rating

class Rating belongs_to :rater, :class_name => "User" belongs_to :rated_user, :class_name => "User", :foreign_key => "rated_id" end

Se podría haber utilizado un ejemplo diferente, pero se eligió para resaltar cuándo es necesaria la opción de clave externa.