2016-08-22 7 views
3

RoR組み込みで平均を見つける方法を知るためのリソースを調べましたaverageActiveRecord::Calculations。私はまた、平均を計算する方法に関するアイデアをオンラインで見てきました:Rails calculate and display averageRails:小さな要素集合の平均を計算する方法

しかし、データベース列から要素の集合の平均を計算する方法についての参照は見つかりません。コントローラで

@jobpostings = Jobposting.all 

@medical = @jobpostings.where("title like ? OR title like ?", "%MEDICAL SPECIALIST%", "%MEDICAL EXAMINER%").limit(4).order('max_salary DESC') 
@medical_salary = "%.2f" % @medical.average(:max_salary).truncate(2) 

@medicalリターンは:

CITY MEDICAL SPECIALIST 
220480.0 
CITY MEDICAL EXAMINER (OCME) 
180000.0 
CITY MEDICAL SPECIALIST 
158080.0 
CITY MEDICAL SPECIALIST 
130000.0 

私は:max_salaryの平均(役職名の下に正しく表示されて各1)を見つけたいです。私は@medical_salary = "%.2f" % @medical.average(:max_salary).truncate(2)を使用してBigDecimalの数値を変換し、:max_salaryの平均を@medicalから見つけました。これは、上に表示されたトップ4に限定されると考えました。

しかし、返される結果は次のとおりです。72322.33、(私がチェック)、代わりにトップ4

の列全体の平均は、これは私は別の条件を追加する必要がありますか? @medicalの平均値が列全体の平均を返すのはなぜですか?

洞察が役立ちます。ありがとう。 limit(4)がメソッドチェーンに以前に表示されていても、

+0

結果を得るために実行されているSQLクエリを共有できますか?また、 'have'と' where'(一見して、私はそれが関連しているとは確信していませんが、私はまだあなたの問題を完全に突き止めていません)を見てみる価値があるかもしれません:http://stackoverflow.com/questions/9253244/sql-having-vs-where – coreyward

答えて

2

@medical.average(:max_salary)@jobpostings.where(...).average(:max_salary).limit(4)として展開されます。

は、次のようになるこれで実行されるクエリを確認することでこれを確認することができます上記のクエリの結果で唯一の平均数があるので

SELECT AVG(`jobpostings `.`max_salary `) FROM `tickets` ... LIMIT 4` 

事実上、LIMIT 4は何もしません。あなたがやろうとしているものを達成する

一つの方法は、次のようになります。

$ @top_salaries = @jobpostings.where("title like ? OR title like ?", "%MEDICAL SPECIALIST%", "%MEDICAL EXAMINER%").limit(4).map(&:max_salary) 
=> [ 220480.0, 180000.0, 158080.0, 130000.0] 
$ average = @top_salaries.reduce(:+)/@top_salaries.size 
=> 172140.0 
+0

あなたの答えとLIMIT 4が何もしない理由を説明していただきありがとうございます。私はコードを試して、それは動作します、私はそれがmax_salary値の降順であったので、順序を追加しました。 '@medical_salaries = @ jobpostings.where(" title like? – teresa

1
@medical.average(:max_salary) 

この行は、次のMySQLのクエリに対応:

SELECT AVG(`jobpostings`.`max_salary`) AS avg_max_salary FROM `jobpostings` WHERE (`jobpostings`.`title` like "%MEDICAL SPECIALIST%" OR title like "%MEDICAL EXAMINER%") LIMIT 4 

MySQLがすでに列にAVGを計算しているのでmax_salary、1行しか返しません。 LIMIT 4句は実際に再生されません。

次試すことができますとき何

@limit = 4 
@medical = @jobpostings.where("title like ? OR title like ?", "%MEDICAL SPECIALIST%", "%MEDICAL EXAMINER%").limit(@limit).order('max_salary DESC') 
@medical_salary = "%.2f" %(@medical.pluck(:max_salary).reduce(&:+)/@limit.to_f).truncate(2) 

それも、例のために動作しません。結果は0です。

+0

「LIMIT」という文字列を使用している理由を説明していただきありがとうございます。 4 'は機能しません。私は 'pluck'メソッドを見たので、私はそれを見ていますが、コードを試していて、引数の数が間違っています。 – teresa

関連する問題