8
votes

Rails has_many, ne trouvez que celles avec des enfants

Mes "produits" table has_many: enregistré_produits.

Je veux utiliser quelque chose comme xxx

où cela ne renvoie que les produits qui ont également une entrée dans le tablette_produits table. Comment pourrais-je y parvenir?


0 commentaires

5 Réponses :


12
votes

Tant que vous avez un étranger_key pour le produit dans la table enregistrée_products, vous pouvez faire:

has_many :registered_products
named_scope :with_registered_products, :joins => :registered_products

# if you're using rails 3
scope :with_registered_products, joins(:registered_products)


1 commentaires

N'oubliez pas de le choisir comme distinct ou vous vous retrouverez avec des doublons ici, c'est le mien: Scope: AT_Least_One_Image, sélectionnez ("Recettes distinctes. * '). Joignons (: images)



0
votes
Product.all(:joins => :registered_products)

0 commentaires

0
votes

Vous pouvez utiliser compteur_cache (http://railcastss.com/episodes/23-counter-cache-column). Il devrait être plus rapide que de faire la jointure juste pour savoir s'il y a des enfants.


0 commentaires

1
votes

Comme le souligne Jakob, s'il existe plusieurs enregistrements d'enfants, vous devez vous assurer que vous ne retournez pas plusieurs objets parents.

Utiliser le "Sélectionner distinct" fonctionnera, mais l'instruction SELECT pourrait interférer lorsque cette portée est associée à d'autres étendues.

Une autre option consiste à vous assurer de vous joindre à une table enfant qui n'a que des enregistrements uniques. Vous pouvez le faire en composant votre jointe comme suit xxx


0 commentaires

5
votes

Cela gérera la duplication.

Product.joins(:registered_products).uniq


0 commentaires