рельсы: как решить этот сложный запрос в рельсах - PullRequest
0 голосов
/ 22 февраля 2010

У меня есть запрос для моей среды Rails, который я не знаю, как решить ...:

У меня есть пользователи и продукты, где любой пользователь владеет несколькими продуктами:

пользователи m: n products

Я решил это с помощью таблицы продаж. для любого продукта, которым владеет пользователь, существует более конкретная таблица

продажа 1: 1, индивидуальная спецификация

Мне нужно получить все продукты от определенного пользователя, где индивидуальные спецификации равны нулю ...

Заранее спасибо Markus

Ответы [ 2 ]

0 голосов
/ 22 февраля 2010

Вопрос немного двусмысленный. Так что это решение основано на моей интерпретации, и не стесняйтесь комментировать, если я ошибся.

Как я понимаю вашу базу данных, у вас есть много-много отношений между пользователями и продуктами через таблицу продаж. И между продажами и индивидуальными спецификациями существует взаимно-однозначное отношение.

В терминах 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"
0 голосов
/ 22 февраля 2010

Я думаю, что вы в основном хотите сделать это . В вашем случае это может быть что-то вроде:

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

Предполагается, что у пользователя есть много продуктов через продажи, которые вы можете или не можете определить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...