2009-07-07 12 views
0

ActiveRecord計算を使用して関連するフィールド名を取得する方法はありますか?たとえば、さまざまな姓のすべての人の平均年齢を調べたいと思います。基本的に私が使用したい:(Rails、ActiveRecord)フィールド名を取得しているときに、ActiveRecord計算を使用するにはどうすればよいですか?

Person.average(:age, :group_by => "last_name") 

...

"Select last_name, AVG(age) FROM People GROUP BY last_name" 

の代替として任意のアイデアを?

+0

あなたは何を意味しますか"関連フィールド名の取得"? – Ethan

+0

私の選択の任意のフィールド。 –

答えて

1

これは、あなたが説明したのとほぼ同じように機能します(しかし、私はあなたが:group_byの代わりに:group_byを使用すると思います)。戻り値はOrderedHashなので、キーは姓になり、値はその姓の平均年齢になります。

返すフィールドはすべてグループに含まれている必要があるため、フィールドを追加したい場合は少しハッキリしてみてください。見返りに

Person.average(:age, :group => "first_name || ',' || last_name") 

キーはコンマになり姓と名を分け:Postgresのでは、たとえば、あなたはそうのような追加のフィールドを連結することができます。 ActiveRecord :: Baseオブジェクトが返されるようにするには、"SELECT ..."スタイルのクエリを使用する必要があります。

0
Person.average(:age, :select => "last_name", :group => "last_name") 

キーが_最後の値の値であるハッシュを返します。値は平均計算の結果です。

+0

オプションでa:select値を指定した場合、グループの列ではなくその値が使用されるため、次のようなクエリで終わります。SELECT avg(last_name)FROM people GROUP BY last_name – Shadwell

+0

本当ですか?私はそれを試み、それは次のクエリ "AVG_last_name、last_nameとしてlast_nameとして選択AVG(last_name)を実行..." –

+0

ええ、それはまさに私が持っているものです。要件は、平均化された列がlast_nameではないことです。これはちょっと奇妙です:もしselect:が存在すれば、column_nameパラメータの代わりに:selectオプションの値を使うコード行があります。 – Shadwell

1

平均化しているクラスの属性を返すには、標準のfind(:all, ...)メソッドでカスタムの:selectオプションを使用する方がよいでしょう。

だからあなたの例では、次のようになります。

groups_of_people = Person.find(:all, 
    :select => 'avg(age) as avg_age, last_name', 
    :group => 'last_name') 

彼らはその後、本当に人のインスタンスではありません(彼らのようなリターンになりますが)しかし、あなたが行うことができます:

groups_of_people.each do |g| 
    g.last_name 
    g.avg_age 
end 
関連する問題