"缺少FROM子句条目"使用嵌套合并ActiveRecord时

时间:2016-07-13 13:03:38

标签: ruby-on-rails ruby postgresql 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

OrderStatus模型:

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 :: UndefinedTable:错误:缺少FROM子句条目   表&#34;订单&#34;第1行:...加入&#34; order_statuses&#34;上   &#34; order_statuses&#34;&#34; ID&#34; =&#34;订单&#34;。&#34; ...

我真正不理解的是,当我做的时候

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

它给了我正确的结果。似乎嵌套与Postgres融为一体。

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

1 个答案:

答案 0 :(得分:1)

尝试使用merge作为Proc,例如

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

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

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