我正在尝试使用 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选项。
也许很快我会深入研究这个问题,并能够为您提供更多方面的帮助。