2010-02-22 4 views
0

j'ai une requête pour mon environnement Rails, que je ne sais pas vraiment comment résoudre ...:rails: comment résoudre cette requête difficile dans les rails

Je les utilisateurs et les produits pour lesquels un utilisateur possède plusieurs produits:

utilisateurs m: n produits

Je résolus qu'avec une table de vente. pour tout produit un utilisateur possède il y a une table plus spécifique

ventes 1: 1 individualspecifications

Je dois obtenir tous les produits d'un utilisateur où les individualspecifications sont nuls ...

Merci à l'avance Markus

Répondre

0

Je pense que vous voulez essentiellement faire this. Dans votre cas, il pourrait être quelque chose comme:

ids = a_user.products.map(&:id) 
Products.find(:all, :conditions => ["id not in (?)", ids]) 

Cela suppose un utilisateur a de nombreux produits par le biais de ventes, que vous pouvez ou ne pas avoir défini.

0

La question est un peu ambiguë. Donc, cette solution est basée sur mon interprétation, et n'hésitez pas à commenter si je me trompe. Comme je comprends votre base de données, vous avez une relation de plusieurs à plusieurs entre les utilisateurs et les produits à travers la table des ventes. Et il existe une relation directe entre les ventes et les spécifications individuelles.

En termes ActiveRecord Cela signifie que vos quatre modèles sont probablement mis en place comme ceci:

class User < ActiveRecord::Base 
    has_many :sales 
    has_many :products, :through => sales 
end 

class Sale < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :product 
    belongs_to :individual_specifications 
end 

class Product < ActiveRecord::Base 
    has_many :sales 
    has_many :users, :through => sales 
end 

class IndividualSpecifcation < ActiveRecord::Base 
    has_one :sale 
end 

Avec cette relation, vous pourriez écrire simple champ nommé dans le produit pour faire le travail.

class Product < ActiveRecord::Base 
    has_many :sales 
    has_many :users, :through => sales 

    named_scope :missing_specification, :joins => :sales, 
    :conditions => {:sales => {:individual_specification_id => nil}} 

end 

Maintenant, vous pouvez juste faire @user.products.missing_specification pour obtenir une liste des produits qui, pour un utilisateur qui manquent spécification.

Si je suis le has_one/relation belongs_to entre les ventes et Specifcation individuelle vers l'arrière, puis la portée devient beaucoup plus compliquée:

named_scope :missing_specification, 
    :joins => "JOIN sales ON sales.id = products.id " + 
    "LEFT OUTER JOIN individual_specifications is ON is.sale_id = sales.id", 
    :conditions => "is.id is NULL"