En este ejemplo, creo un usersin profile, luego creo un profilepara ese usuario. Intenté usar build con una has_oneasociación, pero eso explotó. La única forma en que veo que esto funciona es usando has_many. Se usersupone 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
buildfirma del método es diferente parahas_oney lashas_manyasociaciones.La sintaxis de compilación para la
has_manyasociación:La sintaxis de compilación para la
has_oneasociación:Lea la documentación de la
has_oneasociación para más detalles.fuente
user.build_profilepara editaruser.build_profile if user.profile.nil?y si desea crear un perfil mientras crea un usuario, escribaaccepts_nested_attributes_for :profileesto 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_iden 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_idcolumna 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
#profilemé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. Sibuildno funciona, puede usarnew:es lo mismo que
fuente