2011-01-14 9 views
6

Ich führe eine Abfrage mit einem Bereich und einigen Bedingungen. Etwas wie folgt aus:Eine berechnete Spalte zu einer ActiveRecord Abfrage hinzufügen

conditions[:offset] = (options[:page].to_i - 1) * PAGE_SIZE unless options[:page].blank?  
conditions[:limit] = options[:limit] ||= PAGE_SIZE 
scope = Promo.enabled.active 
results = scope.all conditions 

Ich mag würde eine berechnete Spalte zu der Abfrage hinzufügen (an dem Punkt, wenn ich jetzt anrufen scope.all). Etwa wie folgt:

(ACOS (least (1, COS (0,71106459055501) * COS (-1,2915436464758) * COS (RADIANS (addresses.lat)) * COS (RADIANS (addresses.lng)) + COS (0,71106459055501) * SIN (-1.291543646475) * COS (RADIANS (adressen.lat)) * SIN (RADIANS (adressen.lng)) + SIN (0.71106459055501) * SIN (RADIANS (adressen.lat)))) * 3963.19) als accurate_distance

Gibt es eine Möglichkeit, das zu tun, ohne nur find_by_sql zu verwenden und die gesamte vorhandene Abfrage neu zu schreiben?

Danke!

+0

Möchten Sie diese berechnete Menge zum SELECT-Teil der Anweisung oder als Teil einer Bedingung hinzufügen? Auch, was ist die Datenbank? – bradheintz

+0

Als Teil der Select-Anweisung – rmw

Antwort

9

sicher, verwenden Sie diese:

conditions = Hash.new 
conditions[:select] = "#{Promo.quoted_table_name}.*, (ACOS(...)) AS accurate_distance") 
conditions[:offset] = (options[:page].to_i - 1) * PAGE_SIZE unless options[:page].blank?  
conditions[:limit] = options[:limit] ||= PAGE_SIZE 
scope = Promo.enabled.active 
results = scope.all conditions 

Notiere die neu: wählen - das Active mitteilen, welche Spalten zurückgegeben werden sollen. Das zurückgegebene Objekt in den Ergebnissen hat einen #acurante_distance-Accessor. Leider ist ActiveRecord dumm und kann den Typ der Spalte nicht ableiten. Sie können jederzeit eine Methode hinzufügen:

class Promo 
    def accurate_distance 
    raise "Missing attribute" unless has_attribute?(:accurate_distance) 
    read_attribute(:accurate_distance).to_f # or instantiate a BigDecimal 
    end 
end 

Siehe #has_attribute für weitere Einzelheiten.

+1

Vote Up für "read_attribute" in has_attribute-Link – Naveed

+3

Da dies im Jahr 2011 war Fragen, Ist dies immer noch die bevorzugte Möglichkeit, dies in Rails4 zu tun? – codeObserver

Verwandte Themen