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: 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? P> Mise à jour: J'ai également essayé cela dans les rails 4, voici une session de console: p> mise à jour 2 : Voici un Projet de test sur Github . P> P>
3 Réponses :
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">}
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.
Je n'aime pas cette solution, mais cela semble résoudre le problème:
empl = dept.employees.build { |e| e.association(:department).target = dept}
Veuillez regarder dans l'option : inverse_of code> pour
appartient à code>
et has_many code>
. Cette option traitera des missions à double sens lors de la construction et de la récupération des enregistrements associés dans différents cas. P>
inverse_of code> est idéal pour les validations personnalisées telles que
ActiveModel :: Chaquevalidator code> sur une forme imbriquée à l'aide de
Accept_nedes_attributes_for code> Lorsque vous devez accéder au parent d'un
. has_many code> relation de l'enfant mais ni parent ni enfant n'est enregistré. sans elle,
enfant.parent code> sera
nil code>
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) Code> ...
Le résultat de cette expression est
faux code>. Je vois qu'il y a une variable d'instance
@Target code> sur l'association, qui semble toujours être
nil code> (même pour les enregistrements enregistrés). Je ne sais pas ce que
@target code> est supposé être, mais cela aurait un sens à moi que cela contiendrait la référence que je désirais.