2013-10-31 5 views
5

Ich versuche, ein Projekt von Rails 3 bis Rails 4. In Rails 3 zu aktualisieren, ich tat:Falsche Reihenfolge auf has_many Assoziation, wenn sie von Schienen 3 auf Schienen 4 aktualisieren

class Sale < ActiveRecord::Base 
    has_many :windows, :dependent => :destroy 
    has_many :tint_codes, :through => :windows, :uniq => true, :order => 'code ASC' 
    has_many :tint_types, :through => :tint_codes, :uniq => true, :order => 'value ASC' 
end 

Als ich sale.tint_types nennen , tut es die folgende Abfrage in Rails 3:

SELECT DISTINCT "tint_types".* FROM "tint_types" INNER JOIN "tint_codes" ON "tint_types"."id" = "tint_codes"."tint_type_id" INNER JOIN "windows" ON "tint_codes"."id" = "windows"."tint_code_id" WHERE "windows"."sale_id" = 2 ORDER BY value ASC 

ich es für Rails 4 wie folgt aktualisiert:

class Sale < ActiveRecord::Base 
    has_many :windows, :dependent => :destroy 
    has_many :tint_codes, -> { order('code').uniq }, :through => :windows 
    has_many :tint_types, -> { order('value').uniq }, :through => :tint_codes 
end 

Die Abfrage Änderungen an:

SELECT DISTINCT "tint_types".* FROM "tint_types" INNER JOIN "tint_codes" ON "tint_types"."id" = "tint_codes"."tint_type_id" INNER JOIN "windows" ON "tint_codes"."id" = "windows"."tint_code_id" WHERE "windows"."sale_id" = $1 ORDER BY value, code 

Es fügt Code in der Reihenfolge Klausel und das macht PostgreSQL einen Fehler durch. Ich nehme an, dass es wegen des Bereichs ist, aber ich kann nicht herausfinden, wie man diesen ORDER BY-Code herausbekommt.

Jede Hilfe ist willkommen, Vielen Dank!

+0

versuchen 'unscoped.order ('Wert'). Uniq' – tihom

+0

Bereits versucht, dass. Funktioniert nicht. Es sieht so aus, als ob es zuerst die Reihenfolge von tint_types und danach die von tint_codes einrichtet. – st3fan

Antwort

4

Die Rails-Community hat mir geholfen, die Lösung zu finden.

class Sale < ActiveRecord::Base 
    has_many :windows, :dependent => :destroy 
    has_many :tint_codes, -> { order('code').uniq }, :through => :windows 
    has_many :tint_types, -> { uniq }, :through => :tint_codes 

    def tint_types 
    super.reorder(nil).order(:width => :asc) 
    end 
end 

Weitere Details finden https://github.com/rails/rails/issues/12719.

1

Ändern der tint_types Verein

has_many :tint_types, -> { reorder('value').uniq }, :through => :tint_codes 
+0

Es wird die gleiche Abfrage wie wenn ich nur die Reihenfolge verwendet. – st3fan