Dans cet exemple, je crée un user
avec non profile
, puis je crée plus tard un profile
pour cet utilisateur. J'ai essayé d'utiliser build avec une has_one
association mais ça a explosé. La seule façon dont je vois ce fonctionnement est d'utiliser has_many
. Le user
est censé n'en avoir au plus qu'un profile
.
J'ai essayé ceci. J'ai:
class User < ActiveRecord::Base
has_one :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
end
Mais quand je fais:
user.build_profile
J'obtiens l'erreur:
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1
Y a-t-il un moyen dans les rails d'avoir 0 ou 1 association?
Réponses:
La
build
signature de la méthode est différente pour les associationshas_one
ethas_many
.La syntaxe de construction pour l'
has_many
association:La syntaxe de construction pour l'
has_one
association:Lisez la documentation de l'
has_one
association pour plus de détails.la source
user.build_profile
pour modifieruser.build_profile if user.profile.nil?
et si vous souhaitez créer un profil lors de la création de l'utilisateur, écrivezaccepts_nested_attributes_for :profile
-le dans Modèle utilisateur. et sous la forme de quel utilisateur est créé, écrivez<%= f.simple_fields_for :profile do |p| %>
ceci et continuez.build_<association>
) est un comportement assez étrange et inattendu dans Rails, il y a beaucoup plus de gens à la recherche de cette réponse que la réponse aux questions réelles, si vous voyez ce que je veux dire.Jetez un œil au message d'erreur. Cela vous indique que vous n'avez pas de colonne obligatoire
user_id
dans la table de profil . La définition des relations dans le modèle n'est qu'une partie de la réponse.Vous devez également créer une migration qui ajoute la
user_id
colonne à la table de profil. Rails s'attend à ce que ce soit là et si ce n'est pas le cas, vous ne pouvez pas accéder au profil.Pour plus d'informations, veuillez consulter ce lien:
Bases de l'association
la source
rails g model profile user:references:index address:string bio:text
.Selon le cas d'utilisation, il peut être pratique d'encapsuler la méthode et de créer automatiquement l'association lorsqu'elle n'est pas trouvée.
maintenant appeler la
#profile
méthode retournera le profil associé ou créera une nouvelle instance.source: Lorsque le singe corrige une méthode, pouvez-vous appeler la méthode remplacée à partir de la nouvelle implémentation?
la source
def profile; super || build_profile; end
.Cela devrait être un
has_one
. Si celabuild
ne fonctionne pas, vous pouvez simplement utilisernew
:est le même que
la source