Вопрос немного двусмысленный. Так что это решение основано на моей интерпретации, и не стесняйтесь комментировать, если я ошибся.
Как я понимаю вашу базу данных, у вас есть много-много отношений между пользователями и продуктами через таблицу продаж. И между продажами и индивидуальными спецификациями существует взаимно-однозначное отношение.
В терминах ActiveRecord это означает, что ваши четыре модели, вероятно, настроены так:
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
С помощью этого отношения вы можете написать простую именованную область действия в Product, чтобы выполнить работу.
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
Теперь вы можете просто сделать @user.products.missing_specification
, чтобы получить список продуктов, которые для определенного пользователя отсутствуют в спецификации.
Если я получу отношение has_one / own_to между продажами и индивидуальной спецификацией в обратном направлении, тогда область действия станет намного более сложной:
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"