【发布时间】:2017-07-12 20:56:12
【问题描述】:
我有一个 PurchaseOrder 模型,它与 Line Item 模型具有 has_many 关系。 PurchaseOrder 和 Line Item 模型都与 Delivery 模型具有 has_many 关系。 Delivery 模型具有“expected_arrival”属性。我需要获取满足以下任一条件的所有采购订单:
a) 订单的交货具有昨天或更早的“expected_arrival”属性 b) 订单的任何订单项的“expected_arrival”属性为昨天或更早
我曾计划使用 Rails 5 or 运算符,但在将 or 与 joins 或 includes 结合使用时,Rails 中显然存在一个已知错误:
https://github.com/rails/rails/issues/24055
然后我尝试使用group 和having,如下所示:
PurchaseOrder.left_joins(:deliveries, {line_items: :deliveries})
.group("purchase_orders.id")
.having("MAX(line_items.deliveries.expected_arrival) <= ?
OR MAX(deliveries.expected_arrival) <= ?",
Time.now,
Time.now)`
这产生了以下错误:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: invalid reference to FROM-clause entry for table "deliveries"
LINE 1: ..." IS NULL GROUP BY purchase_orders.id HAVING (MAX(line_items... ^ 提示:表“deliveries”有一个条目,但不能从查询的这一部分引用。 `
Rails 告诉我我无法以这种方式访问交付表,这很奇怪,因为以下每个查询都是自己工作的:
PurchaseOrder.left_joins(:deliveries).group("purchase_orders.id").having("MAX(deliveries.expected_arrival) <= ?", Time.now)`
PurchaseOrder.left_joins({line_items: :deliveries}).group("purchase_orders.id").having("MAX(deliveries.expected_arrival) <= ?", Time.now)`
我想避免对数据库进行调用,这就是我最初想使用or 查询的原因。如您所见,在最后两个查询中,我只是引用deliveries.expected_arrival 而不是line_items.deliveries.expected_arrival。我假设这是 Rails 有问题的地方,这意味着我需要以某种方式给 line_items.deliveries 起别名。
这是一个正确的假设吗?如果是这样,我会怎么做?如果不是,那么构建此查询的正确方法是什么?
【问题讨论】:
-
想要this answer 帮助
-
我更喜欢 Rails 命令而不是普通 SQL。
-
Delivery模型是否与PurchaseOrder/LineItem具有多态关联,还是每个模型都有一个外键? -
@MichaelGorman Deliveries 和 PurchaseOrders 之间以及 Deliveries 和 LineItems 之间存在多对多关系(即连接表)。
-
这使它有点粘,但仍然可行。我会更新我的答案以反映这一点
标签: sql ruby-on-rails activerecord ruby-on-rails-5