2011-01-14 29 views
6

スコープといくつかの条件を使用してクエリを実行しています。私は(私は今scope.allを呼んだ時点で)、クエリに計算列を追加したいActiveRecordクエリに計算カラムを追加する

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 

:このような何か。このような何か:

(ACOS(少なくとも(1、COS(0.71106459055501)* COS(-1.2915436464758)* COS(RADIANS(addresses.lat))* COS(RADIANS(addresses.lng))+ COS(0.71106459055501 )* SIN(RADIANS(addresses.lat))))* 3963.19)as accurate_distance(SIN(-1.2915436464758)* COS(RADIANS(addresses.lat))* SIN(RADIANS(addresses.lng))+ SIN

find_by_sqlを使用して既存のクエリ全体を書き直すことなく、これを行う方法はありますか?

ありがとうございます!新しい

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 

注: - 返して欲しい何列のActiveRecordを伝え選択

+0

この計算量をステートメントのSELECT部分​​に追加するか、条件の一部として追加しますか?また、データベースは何ですか? – bradheintz

+0

selectステートメントの一部として – rmw

答えて

9

確かに、これを使用しています。結果に返されるオブジェクトには#accurante_distanceアクセサがあります。残念ながら、ActiveRecordはダムであり、列の型を推論することはできません。

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 

詳細については、#has_attributeを参照してください。

+1

has_attributeリンクのread_attributeに投票してください – Naveed

+3

これは2011年になって以来のことですが、これはRails4でこれをやっておくのが今の方法ですか? – codeObserver

関連する問題