Neste exemplo, eu crio um user
sem profile
, e depois crio um profile
para esse usuário. Eu tentei usar o build com uma has_one
associação, mas isso explodiu. A única maneira de ver esse trabalho é usando has_many
. O user
é suposto só tem no máximo um profile
.
Eu tenho tentado isso. Eu tenho:
class User < ActiveRecord::Base
has_one :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
end
Mas quando eu faço:
user.build_profile
Eu recebo o erro:
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1
Existe uma maneira nos trilhos de ter 0 ou 1 associação?
Respostas:
A
build
assinatura do método é diferente parahas_one
ehas_many
associações.A sintaxe de construção para
has_many
associação:A sintaxe de construção para
has_one
associação:Leia a documentação da
has_one
associação para obter mais detalhes.fonte
user.build_profile
para ediçãouser.build_profile if user.profile.nil?
e se você deseja criar um perfil enquanto cria o usuário, escrevaaccepts_nested_attributes_for :profile
-o em Modelo de usuário. e na forma em que usuário está sendo criado, escreva<%= f.simple_fields_for :profile do |p| %>
isso e continue.build_<association>
) é um comportamento bastante estranho e inesperado no Rails, há muito mais pessoas procurando por essa resposta do que a resposta das perguntas reais, se você entende o que quero dizer.Dê uma boa olhada na mensagem de erro. Ele está dizendo que você não possui uma coluna obrigatória
user_id
na tabela de perfis . Definir os relacionamentos no modelo é apenas parte da resposta.Você também precisa criar uma migração que adicione a
user_id
coluna à tabela de perfis. O Rails espera que isso esteja lá e, se não estiver, você não poderá acessar o perfil.Para mais informações, consulte este link:
Noções básicas de associação
fonte
rails g model profile user:references:index address:string bio:text
.Dependendo do caso de uso, pode ser conveniente agrupar o método e criar automaticamente a associação quando não for encontrada.
agora, chamar o
#profile
método retornará o perfil associado ou criará uma nova instância.fonte: Ao aplicar um patch a um método, você pode chamar o método substituído da nova implementação?
fonte
def profile; super || build_profile; end
.Deve ser um
has_one
. Sebuild
não estiver funcionando, você pode simplesmente usarnew
:é o mesmo que
fonte