Я разрабатываю программу для складской/экспедиторской компании со следующими отношениями данных. Суть отношений, приведенных ниже, заключается в том, что склад получает сырье (продукт) от различных перевозчиков (клиентов) и хранит их до тех пор, пока они не потребуются для отправки на завод-изготовитель. Когда партия покидает склад, производственное предприятие должно знать, от какой компании было получено каждое сырье. Взгляните на следующий ERD.
РЕДАКТИРОВАТЬ: Мои отношения в текстовой форме.
отгрузка.рб
has_many :product_shipments, :dependent => :destroy
has_many :products, :through => :product_shipments
product_shipment.rb
belongs_to :product
belongs_to :shipment
продукт.rb
has_many :product_shipments
has_many :shipments, :through => :product_shipments, :dependent => :destroy
belongs_to :client
клиент.rb
has_many :products, :dependent => :destroy
У меня возникли проблемы с созданием запросов в формате, соответствующем требованиям. В отчете об отгрузке указывается дата, и он должен повторяться по каждому клиенту и перечислять продукты, отгруженные на производственное предприятие в указанную дату. Он должен быть сгенерирован динамически и отформатирован следующим образом.
Shipment Date: 2013-01-01
Client: 12 Name: ACME Widget Co
Product Name | Product Code | Qty Shipped
_________________________________________
nuts & bolts | gj-3423 | 25
steel sheet | 4g-2394 | 10
dc Motor | cj-c213 | 4
Client: 14 Name: Blah Blah, Inc
Product Name | Product Code | Qty Shipped
_________________________________________
spacers | gj-3423 | 15
epoxy | 4g-2394 | 10
dc Motor | 24-gj19 | 6
Client: 15 Name: Sample Co, Inc
Product Name | Product Code | Qty Shipped
_________________________________________
hot roll 48 | cg-3423 | 15
welding wir | 4g-2394 | 10
dc Motor | c2-1241 | 6
.
.
.
.
Проблема заключается в создании запросов с использованием ActiveRecord. Легко получить отгрузки и продукты на определенную дату, например, ниже. Нелегко захватить исходного клиента, от которого было получено сырье, а затем динамически повторять поставки на производственное предприятие для этого клиента.
ОБНОВЛЕНИЕ: теперь я могу группировать клиентов и поставки, как указано выше. Теперь мне нужно исключить клиентов, у которых НЕТ отгрузки в указанную дату. Приведенное ниже, хотя и несколько правильное, по-прежнему дает ужасный запрос O (n). Вот что у меня есть.
@clients = Client.includes(:products => :shipments)
@clients.each do |c|
puts c.name
c.products.each do |p|
p.shipments.where("ship_date like '#{@ship_date.strftime("%Y-%m-%d")}%'").each do |s|
s.product_shipments.joins(:product).each do |ps|
puts s.bill_of_lading + " " + ps.product_id.to_s + " " + ps.product.product_name.to_s + " " + ps.product.product_code + " " +ps.qty_shipped.to_s + " " + s.ship_date.to_s
end
end
end
end
Моя проблема заключается в том, как мне организовать запрос, чтобы начать с клиентов, а затем перечислить продукты, отправленные 30 июня 2012 года. С этой точки зрения запрос становится сумасшедшим. Я не уверен, как сгенерировать запрос с активной записью, когда отношения настолько удалены.