RAILS: Как сделать запрос для всех объектов, каждая ассоциация которых имеет атрибут, который не является нулевым - PullRequest
2 голосов
/ 21 июня 2011

Я работаю над Rails 3.0.5 и PostgreSQL.

У меня есть модель Offer, в которой много Products.

class Offer < ActiveRecord::Base
  has_many  :products
end

class Product < ActiveRecord::Base
   belongs_to :offer
end

Продукт имеет идентификатор, который обновляется при регистрации в стороннем сервисе. Давайте назовем это service_id. Я хочу область предложений, которая получает все предложения, в которых каждый отдельный продукт зарегистрирован в стороннем сервисе. Другими словами, меня интересует только предложение, если все его продукты имеют сервисный идентификатор.

Объем предложения: joins(:products).where("products.service_id is not NULL"), просто возвращает предложения, в которых есть хотя бы один товар, который не является нулевым.

Любая помощь будет оценена.

(PS: извините за название, я пытался объяснить это как мог.)

EDIT:

Например: если у меня есть 2 предложения: Предложение1 и Предложение2. В Offer1 есть продукты p1 и p2, а в Offer2 есть продукты p3 и p4. Скажем, у p1, p2 и p3 есть сервис, а у p4 нет. Запрос должен возвращать только Предложение1.

Ответы [ 2 ]

3 голосов
/ 26 июня 2011

Это другой подход.

Offer.find_by_sql("SELECT * FROM offers o WHERE NOT EXISTS (SELECT * FROM products WHERE products.offer_id = o.id AND service_id IS NULL)")

Даже идея ORM состоит в том, что в этом сложном запросе вы абстрагируете SQL, я думаю, что лучше выбрать простейшее решение, а не усложнять запрос.

1 голос
/ 22 июня 2011

я верю, что вы хотите сделать, это определить область для продуктов, а затем присоединить эту область к своей области.Ваш вопрос, у меня нет полного ответа для вас.только некоторые мысли.Похоже, вам понадобится как минимум один дополнительный запрос и несколько групп Bys.Что делать, если ..

Вы используете рельсы для хранения контрэша к вашей модели Предложение products_count.

Вы подсчитываете количество обслуживаемых продуктов для каждого предложения.Что-то вроде

Product.serviced.group_by(:offer_id).count

И затем выберите только предложения, в которых два значения, это products_count и результат подзапроса, совпадают?

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