2013-04-26 7 views
4

Voici mes classes:récupérons les enregistrements où tous les enregistrements associés ont attribut

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :products 
end 

Catégorie a une visible booloean.

Je dois créer une portée dans Product afin que je puisse obtenir tous les produits dont les catégories sont toutes visibles (ie: si un produit a 10 catégories, et même une catégorie a visible mis à false, le scope devrait jeter le produit).

Les appels ActiveRecord et les requêtes MySQL sont acceptés.

EDIT: nous avons des centaines de milliers de produits et nous aurions besoin de déléguer ces opérations à la base de données car nous devrons faire la pagination, en triant les goûts sur cette gamme de produits.

Répondre

0

Pouvez-vous essayer de découvrir tous les produits qui ont: visible comme faux.Ensuite, moins de tous les produits. Product.all - Product.where('categories.visible=?', false).includes(:category)

+0

Merci. Je me demande si cette soustraction de tableau ne serait pas déléguée à Ruby? Nous avons des centaines de milliers de produits. Un tel calcul serait probablement un désastre car nous aurions besoin de pagination, par exemple. – amencarini

1
Product.where("id not in (select product_id from categories where visible='false')") 

Hope this helps.

+0

Merci, mais ça ne marche pas: d'abord, 'categories' n'a pas de colonne' category_id'; deuxièmement, s'il existe un produit avec l'identifiant 2 et une catégorie avec l'attribut visible défini sur false et l'identifiant 2, même si le produit n'est pas lié à la catégorie, il sera exclu. – amencarini

Questions connexes