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
- Consulte la guía de Active Record Associations Rails para obtener más detalles.
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.