6
votes

Comment puis-je accéder à une association Activerecord Grandparent via une association mère qui n'a pas encore été sauvée?

J'ai une situation où j'aimerais avoir accès à un grand-parent associé avant que l'objet parent ne soit enregistré. Je peux penser à plusieurs hacks, mais je cherche un moyen propre d'accomplir cela. Prenez le code suivant comme illustration de mon problème: xxx

J'utilise des rails 3.2.15. Je comprends ce qui se passe ici, et je comprends pourquoi Empl.Department_id est nul; Bien que je souhaite que les rails aient eu une référence directe à l'association prospective avant d'appeler sauvegarder, de sorte que la dernière ligne puisse être déléguée à travers l'objet de département non sauvé. Y a-t-il un travail propre?

Mise à jour: J'ai également essayé cela dans les rails 4, voici une session de console: xxx

mise à jour 2 : Voici un Projet de test sur Github .


2 commentaires

Comme c'est très étrange. Je dois l'essayer à nouveau plus tard. Cela a fonctionné assez joyeusement la nuit dernière. Vérifiez si EMPLL.Association (: Département) == Employé.New.Association (: Département) ...


Le résultat de cette expression est faux . Je vois qu'il y a une variable d'instance @Target sur l'association, qui semble toujours être nil (même pour les enregistrements enregistrés). Je ne sais pas ce que @target est supposé être, mais cela aurait un sens à moi que cela contiendrait la référence que je désirais.


3 Réponses :


0
votes

Après une certaine expérimentation de console - vous pouvez simplement dire employé.department.company code>, même si le département n'est pas encore enregistré. département_id code> peut être nul, mais le département code> association code> est là.

> Employee.reflections
 => {:department=>#<ActiveRecord::Reflection::AssociationReflection:0x9a04598 @macro=:belongs_to, @name=:department, @scope=nil, @options={}, @active_record=Employee(id: integer, department_id: integer), @plural_name="departments", @collection=false, @class_name="Department", @foreign_key="department_id">} 


5 commentaires

Donc, j'ai changé cette réponse un peu après avoir essayé de l'essayer :)


Hmmm. Pas pour moi. Quelle version des rails as-tu essayé avec ça?


C'était avec des rails 4. Cela dit, il n'y en a aucune mention dans les «changements notables» pour ActionCord dans les rails 4, il devrait donc être disponible dans 3. Je n'ai pas de rails 3 environnement à la main ou je donnerais ça va. Jetez un coup d'œil à ce que vous recevez de l'employé.Association (: département) et voyez si la référence est enterrée là-bas.


J'ai essayé exactement ce que vous exposez ci-dessus dans les rails 4 aussi. E.Departipartment est nul, et E.Department.company échoue comme prévu un nil. Avez-vous apporté des modifications aux définitions de la classe?


Aucun - Je les ai littéralement laissés tomber dans la console comme ils sont ci-dessus et ont procédé à exécuter ces commandes. (Je devais deviner à quoi ressemblaient les tables, mais il n'y a rien de spécial là-bas.) Je partagerai mes migrations quand je suis à mon ordinateur portable plus tard, mais vraiment - ils sont aussi vanilleux que possible.



1
votes

Je n'aime pas cette solution, mais cela semble résoudre le problème:

empl = dept.employees.build { |e| e.association(:department).target = dept}


0 commentaires