我正在为具有以下数据关系的仓储/运输公司开发一个程序。关于以下关系的细枝末节是,仓库从各种承运人(客户)那里接收原材料(产品)并将它们存储起来,直到需要将它们运送到制造工厂。当货物离开仓库时,制造工厂必须知道每种原材料来自哪家公司。看看下面的 ERD。
编辑:我的文本形式的关系。
装运.rb
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
我的问题是如何组织查询以从客户开始,然后列出 2012 年 6 月 30 日发货的产品。从这个角度来看,查询变得古怪。当关系离得太远时,我不确定如何生成带有活动记录的查询。