En este ejemplo, creo un user
sin profile
, luego creo un profile
para ese usuario. Intenté usar build con una has_one
asociación, pero eso explotó. La única forma en que veo que esto funciona es usando has_many
. Se user
supone que el solo tiene como máximo uno profile
.
He estado intentando esto Yo tengo:
class User < ActiveRecord::Base
has_one :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
end
Pero cuando lo hago:
user.build_profile
Me sale el error:
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1
¿Hay alguna forma en los rieles para tener 0 o 1 asociación?
Respuestas:
La
build
firma del método es diferente parahas_one
y lashas_many
asociaciones.La sintaxis de compilación para la
has_many
asociación:La sintaxis de compilación para la
has_one
asociación:Lea la documentación de la
has_one
asociación para más detalles.fuente
user.build_profile
para editaruser.build_profile if user.profile.nil?
y si desea crear un perfil mientras crea un usuario, escribaaccepts_nested_attributes_for :profile
esto en Modelo de usuario. y en forma de qué usuario se está creando, escriba<%= f.simple_fields_for :profile do |p| %>
esto y continúe.build_<association>
) es un comportamiento bastante extraño e inesperado en Rails, hay muchas más personas que buscan esta respuesta que la respuesta de las preguntas reales, si sabes a lo que me refiero.Mire bien el mensaje de error. Le dice que no tiene la columna requerida
user_id
en la tabla de perfil . Establecer las relaciones en el modelo es solo una parte de la respuesta.También debe crear una migración que agregue la
user_id
columna a la tabla de perfil. Rails espera que esto esté allí y, si no es así, no puede acceder al perfil.Para obtener más información, consulte este enlace:
Fundamentos de la asociación
fuente
rails g model profile user:references:index address:string bio:text
.Dependiendo del caso de uso, puede ser conveniente ajustar el método y construir automáticamente la asociación cuando no se encuentra.
ahora llamando al
#profile
método devolverá el perfil asociado o creará una nueva instancia.fuente: cuando el mono parchea un método, ¿puede llamar al método anulado desde la nueva implementación?
fuente
def profile; super || build_profile; end
.Debería ser a
has_one
. Sibuild
no funciona, puede usarnew
:es lo mismo que
fuente