2009-10-29 3 views
3

j'ai essayé de définir une default_scope de la manière suivante:default_scope avec: Relie et: sélectionnez

default_scope :joins => :product, :select => "catalog_products.*, products.*" 

Ce que je veux de Rails est-ce que:

SELECT catalog_products.* FROM `catalog_products` INNER JOIN `products` ON `products`.id = `catalog_products`.product_id 

Quand je le définis comme named_scope, tout va bien:

named_scope :extended, :joins => :product, :select => "catalog_products.*, products.*" 


SELECT catalog_products.*, products.* FROM `catalog_products` INNER JOIN `products` ON `products`.id = `catalog_products`.product_id 

est-ce censé être un bug ou est-ce un comportement correct? J'utilise Rails 2.3.4.

Merci!

+0

Alors .. quelle est la question? :) Qu'aimeriez-vous recevoir? Les deux résultats sont identiques. –

+0

Oh! Merci d'avoir signalé! Fixé. –

Répondre

5

Ceci est le comportement indenté. Quelle que soit la manière dont vous définissez la portée, vous ne pouvez récupérer que les objets de la classe définissant la portée. Malgré le fait que vous sélectionnez des colonnes de modèle, Rails ne fera rien avec eux. Cependant, vous pouvez demander des associations de chargement. Ce qui ressemble à ce que vous essayez de faire, avec un produit sur chaque trouvaille.

En fait, il est plus simple que vous attendez:

default_scope :include => :product 

La raison pour laquelle votre instruction select fait partie de la requête dans le champ du nom, mais pas la portée par défaut est que chaque rail fondé sur une requête remplace les sélectionnez les options du interroge plus loin la chaîne de méthode. Les seules options SELECT qui font la différence avec ce qui est renvoyé par les instructions find sont celles qui sélectionnent un sous-ensemble des colonnes du modèle.

+0

Merci, à la fin cela résout vraiment mon problème. Je connaissais le chargement impatient. Mon problème avec cela était que j'avais besoin de convertir le jeu de résultats en json et que la méthode to_json de Rails ajoute à la sortie json uniquement les attributs qui ont été sélectionnés dans la requête. Cependant, j'ai trouvé une solution de contournement - la méthode to_json est très configurable et me permet d'ajouter très facilement les attributs de l'association chargée impatiemment. Merci encore! –

Questions connexes