Ich versuche ActiveRecord Abfragen zu verwenden, um Geräte zu bestimmten Benutzern in meiner DB (Geräte sind nur Modelle mit Push-Benachrichtigungen Schlüssel) auszuwählen, in Bezug auf wie viele Bestellungen Benutzer gemacht oder andere Dinge."Fehlender FROM-Klausel-Eintrag" bei verschachtelten Zusammenführungen mit ActiveRecord
(In allen Modellen entfernt ich nicht relevant oder private Sachen)
Hier mein Gerätemodell ist:
class Device < ActiveRecord::Base
belongs_to :user
end
User-Modell:
class User < ActiveRecord::Base
has_many :order
has_one :device
end
Auftragsmodell:
class Order < ActiveRecord::Base
belongs_to :user
belongs_to :order_status
scope :valid, -> { joins(:order_status).merge(OrderStatus.valid) }
end
OrderStatus-Modus l:
class OrderStatus < ActiveRecord::Base
has_many :orders
scope :valid, -> { where.not(name: "processing") }
end
Also, mit all diesen, ich versuche Geräte Sachen Benutzer zu erhalten, die mehr als x gültig Bestellungen gemacht haben. Hier ist, wo ich bin:
Device.all.joins(:user).merge(User.joins(:order).merge(Order.valid).group("users.id").having("count(orders.id) > ?", [NB_ORDERS]))
Diese Anfrage erzeugt:
: 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
und gibt mir diese Fehlermeldung:
Hirb Error: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "orders" LINE 1: ... JOIN "order_statuses" ON "order_statuses"."id" = "orders"."...
Was ich wirklich nicht verstehen ist, dass, wenn ich tun Sie einfach
User.joins(:order).merge(Order.valid).group("users.id").having("count(orders.id) > ?", [NB_ORDERS])
Es gibt mir das richtige Ergebnis. Es scheint, als ob verschachtelte Verschmelzungen mit Postgres übergehen.
Gibt es eine Möglichkeit, dieses Problem zu lösen? (Ich habe eine große Menge an Datensätzen, die mit SQL/Active wesentlich ist)
Warum verwenden Sie 'Device.all'? Es gibt Array nicht Relation zurück. Versuchen Sie 'Device.joins (...)' – Aleksey
Ich bin ziemlich sicher, dass es eine Beziehung zurückgibt. Wie auch immer, wenn ich .all entferne, bekomme ich genau den gleichen Fehler – Shrolox
Kannst du versuchen mit Proc 'merge', dh' Device.all.joins (: user) .merge (-> {User.joins (: order)) .. .}) '? – Aleksey