Étant donné un modèle d'école et un modèle d'étudiant avec l'école ayant une relation has_many à l'étudiant: où actif_year_id est une méthode définie dans le modèle d'école, je rencontre une erreur qui "actif_year_id est indéfini" lorsque vous appelez: p> La condition fonctionne bien lorsque je le fais, disons, p> Utilisation des rails 3.0.9, REE 1.8.7. P> P>
4 Réponses :
Cela devrait être un commentaire mais il n'y a pas assez de place.
SO: P>
School.where(:active => true).includes(:students)
Je pense que la réponse implicite de @codeglot peut être que vous devez étiqueter sur un . Students code> à votre
School.where (: actif => vrai). Enclut (: les étudiants) Code > Requête.
@codeglot: Je comprends qu'ils sont deux choses différentes. Je dis que l'erreur ne se produit que lorsque vous utilisez Inclus. Lorsque je fais la requête d'inclure, les rails font une autre requête pour les étudiants, à droite. Dans cette requête, j'ai besoin de l'état dans la procédure pour être annexé.
Je pense que cela n'est pas possible de réaliser car le contexte de l'endroit où le PROC est exécuté est différent en fonction de la manière dont elle s'appelle. J'ai fabriqué une application de base avec vos modèles et c'est ce qui se passe lorsque vous appelez les différentes méthodes ( AP est-ce a>): Lorsque vous appelez les élèves de la relation d'une instance d'école, le contexte de la procédure est l'instance donnée mais lorsque vous appelez la relation inclut le contexte est différent et ce que le procédé reçoit comme auto est Je pense qu'une relation has_many ne peut pas être utilisée avec ce type de procédé qui s'appuie sur une méthode d'instance d'une instance d'école. Je pense que la seule façon d'utiliser des procs comme décrit ici est de calculer une condition Au moment de l'exécution qui n'implique pas les méthodes d'instance (conditions de temps, où avec des données de modèles non liés, etc.). P> En outre le tout cela est valide si le école code> afin qu'il réponde au
actif_year_id code> méthode p>
Student Code> Classe , donc il ne répond pas à cette méthode et cela déclenchera l'erreur p>
School.AllUt (: les étudiants). Mon exemple ne peut pas fonctionner car il devrait appeler la méthode
active_year_id code> sur chaque forte> instance forte> école code> (qui doit être extraite à partir de la DB avant que la notice puisse être évaluée ) et donc disparaître l'effet du comportement code> code>. p>
actif_year_id code> est une méthode calculée définie dans
École code> classe basée sur des données d'instance. Au lieu de cela si le
actif_year_id code> n'est pas une méthode, mais un champ (une colonne de base de données) de la classe code> classe code> que vous pouvez jouer avec Joignons et Scopes pour obtenir un résultat similaire à ce que vous voulez réaliser, mais il doit être codé à la main. p> p>
Ceci est un peu vieux, mais je vois beaucoup la question et je n'ai vu aucune solution satisfaisante. L'ajout d'une condition comme celle-ci est essentiellement équivalente à la création d'une association avec deux clés publiques / privées.
@fabio a raison de dire " le contexte de l'endroit où le procédé est exécuté est différent de la manière dont il est appelé. em> "Cependant, je pense que vous pouvez surmonter le problème" active_year_id est indéfini "problème" p> dans l'exemple: p> Le problème est que dans certaines situations , la procédure est exécutée dans le contexte d'un objet scolaire particulier et parfois en tant qu'associations Activerecord :: Associations :: JOINDEPENDENCE :: AKIALAssociation. J'ai résolu ceci en utilisant un procédé légèrement plus compliqué, comme celui-ci: p> Donc, lorsque la condition est calculée pour un objet scolaire réel, lorsque le contexte ne présente pas Nous avons trouvé cette solution utilisons l'association dynamique avec succès. P> P>
Selon la question initiale, cette solution fonctionne pour les rails 3. Cela ressemble à des rails 4 aura quelques nouvelles options d'association (ou au moins quelques nouvelles signatures de méthodes.)
FYI Vous pouvez accéder à la collection actuelle L'inclusion est appelée ... Cela pourrait aider dans certains cas:
serait génial d'entendre si vous avez trouvé une solution autre que vous n'entraînez-vous que les inclusions.
J'ai le même problème: Stackoverflow.com/Questtions/10502307/...
@Vijaydev dans mon exemple répliqué le code
école.Où (: id => 10) .Students code> Autres exception qui est
méthode non définie code> Les étudiants 'pour # `parce que la valeur de retour de
où code> est un objet relationnel. Êtes-vous sûr que votre code fonctionne et ce n'est pas
école.find (10) .Students code> (qui fonctionne comme prévu)