2016-06-22 5 views
0

データフィールドの中央値計算を実行しようとしています。データフィールドのループループスルー

Glazeには、次の小数フィールドがあります。"k2o", "na2o", "cao", "bao", "mgo", "sro"

Glazeのデータベース全体を使用して各データフィールドの中央値を計算する方法を書きたいと思いますが、それぞれoxideの個別のメソッドを記述したくありません。

oxideの名前の配列を使用してループする予定でした。私は@oxides = ["k2o","n2o","cao","bao","mgo","sro"]という配列を定義しました。

ビュー:

<% @oxides.each do |oxide| %> 
<%= oxide %> median: <%= median(oxide) %><br/> 
<% end %> 

コントローラー:

def median(oxide) 
    g = Glaze.all 
    array = g.map { |g| g.oxide.to_s.to_f.round(3) } 
    sorted = array.sort 
    len = sorted.length 
    (sorted[(len - 1)/2] + sorted[len/2])/2.0 
end 
helper_method :median 

これはエラーを返します:

unknown method 'oxide'

私は配列にoxideの代わりに​​に置き換えた場合、それは正常に動作します。私は変数の型に慣れていませんが、oxideフィールドが存在しないのでメソッドを探していると思います。

oxideの値を調べて、g.k2o ...、g.na2o ...、g.cao ...などを簡単にループできるようにするにはどうすればよいですか。 ?

Glaze

答えて

0

クラスがインスタンスメソッドoxideを有しているが、代わりに5つの方法​​、na2ocaobaomgosroを有しありません。

array = g.map { |g| g.oxide.to_s.to_f.round(3) } 

インナーgGlazeのインスタンスであるので、あなたはg.oxideを呼び出すとき、それは失敗します。あなたはすべてのフィールドに同じことを行いたい場合は、すなわち

k2o_array = g.map { |g| g.k2o.to_s.to_f.round(3) } 
na2o_array = g.map { |g| g.na2o.to_s.to_f.round(3) } 
cao_array = g.map { |g| g.cao.to_s.to_f.round(3) } 
bao_array = g.map { |g| g.bao.to_s.to_f.round(3) } 
mgo_array = g.map { |g| g.mgo.to_s.to_f.round(3) } 
sro_array = g.map { |g| g.sro.to_s.to_f.round(3) } 

あなたはpublic_sendを必要とする:

あなたに私が酸化物リストを格納注

{:k2o=>1.111, :na2o=>2.222, :cao=>3.333, :bao=>4.444, :mgo=>5.556, :sro=>6.667} 
を与える
OXIDES = [:k2o, :na2o, :cao, :bao, :mgo, :sro] 

def median(oxide) 
    med = Hash.new 
    OXIDES.each do |oxide| 
    values = Glaze.all.map do |glaze| 
     glaze.public_send(oxide).to_s.to_f.round(3) 
    end 
    values.sort! 
    len = values.length 
    med[oxide] = (values[(len - 1)/2] + values[len/2])/2.0 
    end 
    return values 
end 
helper_method :median 

instance variableの代わりにconstantが変更されることはありません。

関連する問題