2010-01-20 5 views
0

J'ai donc une classe ActiveRecord avec deux étendues nommées différentes qui incluent des paramètres de jointure. Lors de l'exécution d'un rapport, j'arrive d'avoir une situation où l'on est appelé à l'intérieur de l'autre:Étendues nommées avec jointures imbriquées (erreur explosive)


1 Model.scope_with_some_joins.find_in_batches do |models| 
2 models.each do |mdl| 
3  other_comparisons = Model.scope_with_other_joins 
4 end 
5 end 

Mon problème est sur la ligne 3 - Je reçois une erreur d'exécution me montrant que, pour une raison quelconque lors de l'exécution de la deuxième interroge la maintenance de l'étendue join à partir de la requête externe. J'ai vraiment besoin qu'il soit exécuté séparément, sans partage de contexte avec la requête externe. Des pensées ou des idées?

(Je dois mentionner que le problème est une « colonne ambiguë » erreur car il y a une table qui est jointe à des deux requêtes)

Répondre

1

Vous cherchez

Model.with_exclusive_scope { ...do your find in here... } 

Cela supprimera toutes les étendues actuellement utilisées pour le bloc.

Un exemple d'utilisation:

# in model.rb 
def self.find_stuff 
    self.scope_with_some_joins.find_in_batches do |models| 
    models.each do |mdl| 
     self.with_exclusive_scope do 
     other_comparisons = self.scope_with_other_joins 
     end 
    end 
    end 
end 

Ensuite, vous requête avec Model.find_stuff. De cette façon, la logique est enveloppée dans le modèle, pas dans le contrôleur.

+0

Merci jonnii! Une note est que "with_exclusive_scope" est protégé (au moins dans les rails 2.3.2) donc pour en faire usage, vous devez utiliser:

 Model.send(:with_exclusive_scope) 

+0

Vous ne l'utiliseriez pas habituellement dans un contrôleur, je mettrai à jour mon message à vous montrer comment l'utiliser. – jonnii

Questions connexes