2016-03-22 10 views
0

Ich habe einen Select mit Active Record mit vielen Joins gemacht. Dies führte zu doppelten Werten. Nach der wählen Funktion gibt es die distinkte Funktion mit Wert: ID. Aber das hat nicht funktioniert!ActiveRecord distinct funktioniert nicht

Hier ist der Code:

def join_query 
    <<-SQL 
    LEFT JOIN orders on orders.purchase_id = purchases.id 
    LEFT JOIN products on products.id = orders.complete_product_id 
    SQL 
end 

def select_query 
    <<-SQL 
    purchases.*, 
    products.reference_code as products_reference_code 
    SQL 
end 

result = Purchase.joins(join_query) 
       .select(select_query) 
       .distinct(:id) 

Natürlich weder verschieden! oder uniq Funktionen funktioniert. Die deutlich! gab einen Fehler von "ActiveRecord :: ImmutableRelation" zurück, von dem ich nicht weiß, was es bedeutet.

Um dies zu beheben, habe ich einen Hack, Konvertieren der ActiveRecord_Relation-Objekt in ein Array und ich verwendete die uniq Funktion von Ruby.

Was geht hier vor?

+0

'ImmutableRelation' bedeutet, dass Active [hat bereits die Abfrage geholt] (http://api.rubyonrails.org/classes/ActiveRecord/ImmutableRelation.html). Versuchen Sie, Ihre Joins am Ende zu setzen. – sjagr

+0

Welche RDBMS verwenden Sie? Was siehst du, wenn du '.distinct (: id)' nicht benutzt? Ich bezweifle die Verwendung von '.Distinct (: ID)' ist das Problem, weil es versucht, Datensätze auszuwählen, die abgerufen werden. –

Antwort

0

versuchen this out:

def select_query 
    <<-SQL 
    DISTINCT ON (purchases.id) purchases.id, 
    products.reference_code as products_reference_code 
    SQL 
end 

add more comma separated column names in select clause 

Purchase.select(select_query).joins(join_query) 
Verwandte Themen