фильтрация рельсов в рефлексивных отношениях - PullRequest
0 голосов
/ 12 сентября 2011

С учетом следующих моделей, использующих рельсы 2.1:

class Product < ActiveRecord::Base
  has_many :from_sources, :class_name => 'ProductSource', :foreign_key => 'to_product_id'
  has_many :to_sources, :class_name => 'ProductSource', :foreign_key => 'from_product_id'

  has_many :from_products, :through => :from_sources
  has_many :to_products, :through => :to_sources
end

class ProductSource < ActiveRecord::Base
  belongs_to :from_product
  belongs_to :to_product
end

class Supplier < ActiveRecord::Base
  has_many :products
end

Я действительно не могу найти способ отфильтровать товары поставщика, которые поступают от другого поставщика.

Позвольте мне привести пример с некоторыми данными.

  • Поставщик SA имеет продукты SAPA, SAPB
  • Поставщик SB имеет продукцию SBPA, SBPB
  • Поставщик SC имеет продукты SCPA (перераспределяется из SBPB), SCPB (перераспределяется из SAPB)

Я хочу отфильтровать: товары от поставщика SC только с продуктами, которые поставляются из SB.

Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2011

не уверен, хорошо ли я понимаю вашу схему, но я думаю, что вам, по крайней мере, понадобится, чтобы ваш продукт принадлежал поставщику, поэтому вы можете отфильтровать таблицу продуктов по тому, какой поставщик ее предоставляет:

Product.find(:conditions => {:supplier_id => @sb.id})

Теперь вы можете:

  • найти все продукты, ГДЕ идентификатор поставщика является идентификатором SC,
  • ВНУТРЕННИМ СОЕДИНИТЬ их с их from_products,
  • фильтровать строки ГДЕ from_products 'supplier_idэто идентификатор SB,
  • и, наконец, выберите DISTINCT id для отфильтрованных строк, чтобы у вас был только один экземпляр SCPB.

поэтому фактический запрос SQL должен выглядеть следующим образом:

SELECT DISTINCT products.id, (etc...)
FROM products, product_sources
  INNER JOIN product_sources
  ON products.from_sources = product_sources.id
  LEFT JOIN products AS source
  ON product_sources.id = source.id
WHERE products.supplier_id = (SC's id) AND source.supplier_id = (SB's id)

Извините, но я не очень знаком с интерфейсом запроса rails 2 (rails 3 очень приятен), так что я могуне скажу больше, но я думаю, что это правильная логика.

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