Ich verwende eine SELECT DISTINCT
und habe Probleme beim Versuch, meine Ergebnisse durch einen zugeordneten Wert zu ordnen. Nehmen Sie dieses Beispiel (in Rails):Bestellen von Datensätzen aus `has_many through, -> {distinct}` durch einen zugehörigen Wert
Ich habe ein Cook
Modell mit einem deutlichen customers
Verein:
has_many :customers, -> { distinct }, through: :orders, source: :user
Es ist anders, weil ich nur die Kunden wollen einmal zählen, auch wenn sie mehrere Aufträge haben.
Die generierte SQL hierfür ist:
> cook.customers.to_sql
=> "SELECT DISTINCT \"users\".* FROM \"users\"
INNER JOIN \"orders\" ON \"users\".\"id\" = \"orders\".\"user_id\"
INNER JOIN \"meals\" ON \"orders\".\"meal_id\" = \"meals\".\"id\"
WHERE \"meals\".\"cook_id\" = 1"
Dies funktioniert gut! (Die orders
Tabelle wird durch meals
verbunden sind, aber fühlen Sie sich frei zu ignorieren)
Ich möchte diese Liste der Kunden bestellen vom letzten created_at
Wert der Aufträge dieser Kunden. Aber wenn ich das tue, bekomme ich einen Fehler:
cook.customers.order('orders.created_at DESC').to_sql
=> "SELECT DISTINCT \"users\".* FROM \"users\"
INNER JOIN \"orders\" ON \"users\".\"id\" = \"orders\".\"user_id\"
INNER JOIN \"meals\" ON \"orders\".\"meal_id\" = \"meals\".\"id \"WHERE \"meals\".\"cook_id\" = 1 ORDER BY orders.created_at DESC"
> cook.customers.order('orders.created_at DESC')
ActiveRecord::StatementInvalid: PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...eals"."id" WHERE "meals"."cook_id" = $1 ORDER BY orders.cre...
Auch wenn ich die Tabellen explizit beitreten (glaube nicht, dass ich wegen has_many through
brauchen sollte), ist diese immer noch nicht funktioniert.
cook.customers.joins(:orders).order('orders.created_at DESC').to_sql
=> "SELECT DISTINCT \"users\".* FROM \"users\" INNER JOIN \"orders\" \"orders_users\" ON \"orders_users\".\"user_id\" = \"users\".\"id\" INNER JOIN \"orders\" ON \"users\".\"id\" = \"orders\".\"user_id\" INNER JOIN \"meals\" ON \"orders\".\"meal_id\" = \"meals\".\"id\" WHERE \"meals\".\"cook_id\" = 1 ORDER BY orders.created_at DESC"
Irgendwelche Hinweise? Ich bin auf der Suche nach einer Lösung, die eine ActiveRecord-Beziehung zurückgibt (also keine Verwendung sort_by
), weil ich weitere Anfragen an diese verketten möchte.
Danke :)
Dank ist dies jedoch nicht so optimal, weil ich in der Lage sein mag, dass 'Cook.first.customers' zu nennen (oder ähnlich) und die gewünschten Ergebnisse erhalten, ohne zusätzliche Methoden in meinem Controller anrufen zu müssen. – djfdev