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"