Ruby on Rails - "Missing FROM-clause entry" 将嵌套合并与 ActiveRecord 一起使用时



我正在尝试使用 ActiveRecord 查询来选择属于数据库中特定用户的设备(设备只是包含推送通知键的模型)、用户下了多少订单或其他内容。

(在所有模型中,我都删除了不相关或私人的东西)

这是我的设备型号:

class Device < ActiveRecord::Base
    belongs_to :user
end

用户型号:

class User < ActiveRecord::Base
  has_many :order
  has_one :device
end

订货模式:

class Order < ActiveRecord::Base
  belongs_to :user
  belongs_to :order_status
  scope :valid, -> { joins(:order_status).merge(OrderStatus.valid) }
end

订单状态模型:

class OrderStatus < ActiveRecord::Base
  has_many :orders
  scope :valid, -> { where.not(name: "processing") }
end

因此,有了所有这些,我正在尝试将设备所属提供给已下达 x 个以上有效订单的用户。这是我所在的地方:

Device.all.joins(:user).merge(User.joins(:order).merge(Order.valid).group("users.id").having("count(orders.id) > ?", [NB_ORDERS]))

这将生成此请求:

: SELECT "devices".* FROM "devices" INNER JOIN "users" ON "users"."id"
= "devices"."user_id" LEFT OUTER JOIN "order_statuses" ON "order_statuses"."id" = "orders"."order_status_id" LEFT OUTER JOIN "orders" ON "orders"."user_id" = "users"."id" WHERE ("order_statuses"."name" != $1) GROUP BY users.id HAVING count(orders.id) > 10

并给了我这个错误:

Hirb 错误: PG::未定义表: 错误: 缺少 的 FROM 子句条目 表"订单"第 1 行:...加入"order_statuses" 上 "order_statuses。"id" = "订单"。...

我真正不明白的是,当我只是做

User.joins(:order).merge(Order.valid).group("users.id").having("count(orders.id) > ?", [NB_ORDERS])

它给了我正确的结果。似乎嵌套合并会搞砸Postgres。

有没有办法解决这个问题?(我有大量的记录,所以使用SQL/ActiveRecord是必不可少的)

尝试将merge用作Proc,例如

Device.joins(:user).merge(-> { User.joins(:order)... })

不起,对不,我无法给出任何解释,因为我对merge方法知之甚少。
我刚刚阅读了文档并看到了Proc选项。

也许很快我会深入研究这个问题,并能够为您提供更多方面的帮助。

最新更新