9
votes

Rails - build_association ne fonctionne pas pour une relation has_one et appartient

J'ai deux modèles xxx pré>

mais quand j'essaie de créer un parent de l'enfant par exemple. Sub.Build_Client La clé étrangère n'est pas définie, par exemple P>

?> client = Client.new
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil>
>> client.save(false)
=> true
>> sub = client.build_subscription
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: 4>
>> sub.save(false)
=> true
>> sub
=> #<Subscription id: 5, token: nil, user_id: nil, created_at: "2010-01-11 06:09:32", updated_at: "2010-01-11 06:09:32", cancelled: nil, active: nil, client_id: 4>
>> client
=> #<Client id: 4, server_id: nil, ip: nil, created_at: "2010-01-11 06:09:02", updated_at: "2010-01-11 06:09:02">
>> ^C


0 commentaires

5 Réponses :


10
votes

Selon vos associations de modèle, un abonnement est un enfant d'un client .

Si vous créez d'abord un abonnement, puis créez un client selon votre premier exemple, les rails n'ont aucun moyen de définir une valeur de clé client dans les abonnements À ce stade, vous n'avez pas créé l'enregistrement client, il n'y a donc rien à associer à l'abonnement. C'est pourquoi vous devez d'abord créer le dossier de parent (c'est-à-dire un client associé avec un enregistrement d'abonnement enfant à l'aide de la méthode build_subscription .


3 commentaires

Merci John, je pensais que c'était le cas (j'ai consulté le Guide des rails mais que cela n'aurait pas pu trouver que cela a été expliqué, vous vouliez donc confirmer ici sur Stackoverflow). Mais comment venir avec un has_many appartient à la relation que cela peut être fait.


Je pensais que si cela ne peut pas être fait pourquoi est la méthode de construction là-bas? Si l'ID Foreign peut-il être défini dans quelle mesure la méthode de cette relation dans cette relation?


Voulez-vous dire celui de ma première réponse, deuxième réponse ou les deux? Je pourrais poser une nouvelle question à cela comme une nouvelle question.



3
votes

Cela ne fonctionne pas dans les deux sens, un parent peut construire un enfant avec la méthode Build_association mais pas vice versa.

Lire: http://apidock.com/rails/acterecord/associations/ ClassMethods / has_one


0 commentaires

1
votes

Dans mes projets, j'ai de nombreuses associations similaires, mais j'interdisons souvent la définition client_id à NULL, donc je ne peux donc pas créer objet enfant sans objet parent.

Essayez: p>

sub = Subscription.new
sub.build_client
sub.save


0 commentaires

0
votes

Dans l'un des commentaires, vous demandez pourquoi la méthode Build_Client est là. Lorsque vous enregistrez le client, puis vérifiez le SUB, c'est nul, mais si vous auriez également appelé

sub.save(validate: false)


0 commentaires

1
votes

Cela semble avoir été corrigé dans des rails 4.2.5 ou plus tôt. (Je ne suis pas sûr de la version la plus ancienne avec le correctif. J'ai seulement testé 4.2.5.)

Lorsque le parent est enregistré, une fois l'enregistrement parent inséré, une mise à jour est automatiquement exécutée pour ajouter l'ID parent à l'enregistrement enfant.

Cependant, je n'ai trouvé aucune documentation sur ce comportement, le code concerné ou les tests automatisés, donc je ne sais pas si cela était intentionnellement corrigé et que ce comportement doit être invoqué. Il peut être préférable de rester avec les solutions dans les autres réponses ici.

Cela semble aussi être toujours cassé pour HAS_MANY dans les rails 4.2.5.


0 commentaires