2016-07-13 10 views
0

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)

+0

Warum verwenden Sie 'Device.all'? Es gibt Array nicht Relation zurück. Versuchen Sie 'Device.joins (...)' – Aleksey

+0

Ich bin ziemlich sicher, dass es eine Beziehung zurückgibt. Wie auch immer, wenn ich .all entferne, bekomme ich genau den gleichen Fehler – Shrolox

+0

Kannst du versuchen mit Proc 'merge', dh' Device.all.joins (: user) .merge (-> {User.joins (: order)) .. .}) '? – Aleksey

Antwort

1

Try merge als Proc zu verwenden, wie

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

Sorry, rechts nicht kann ich keine Erklärungen geben, weil ich nicht weiß, viel über merge Methode.
Ich lese gerade die docs und Säge Proc Option.

Vielleicht werde ich bald in das Problem tauchen und in der Lage sein, Ihnen mit etwas mehr als das zu helfen.