2012-01-19 19 views
0

Rails 3.0.3アプリケーション(Dreamhostの共有サーバーで動作しません)。Rails:1つのモデルから多数のデータサブセットを扱うには?

1つのモデルのデータのサブセットから計算された平均を表示するページがあります。

今、それぞれの平均値を個別に算出され、このような:

ビューから、私はそうのようなユーザモデルに配置されている平均的なメソッドを呼び出すために考案認証によって提供さcurrent_userヘルパーを使用しています:

<%= current_user.seven_day_weight_average %> 
<%= current_user.fourteen_day_weight_average %> 
<%= current_user.thirty_day_weight_average %> 

ここでは、ユーザモデルのパブリックメソッドと平均化法です:

def seven_day_weight_average 
calculate_average_weight(7) 
end 

def fourteen_day_weight_average 
calculate_average_weight(14) 
end 

def thirty_day_weight_average 
calculate_average_weight(30) 
end 

. . . 
private 
def calculate_average_weight(number_days) 
    temp_weight = 0 
    weights_array = self.weights.find_all_by_entry_date(number_days.days.ago..Date.today) 
    unless weights_array.count.zero? 
    weights_array.each do |weight| 
     temp_weight += weight.converted_weight 
    end 
    return (temp_weight/weights_array.count).round(1).to_s 
    else 
    return '0.0' 
    end 
end 

これは非常にefficieいないようですnt - 計算された平均値ごとにデータベースが照会されます。

これらの平均値を1つのデータベースクエリでページで使用できるようにするにはどうすればよいですか?

答えて

2

あなたが最後の30日間、変換後の重みの配列をキャッシュすることができ(30を想定すると、バック最大日です)、このような何か:

def calculate_average_weight(number_days) 
    @converted_weights ||= weights.where("entry_date > ?", 30.days.ago).group_by(&:entry_date).sort_by do |date,weights| 
    date 
    end.collect do |date,weights| 
    weights.collect(&:converted_weight) 
    end 
    weights_during_period = @converted_weights[0..number_days-1].flatten 
    weights_during_period.sum/weights_during_period.length 
end 

説明:まず

||=を取得または設定し@converted_weights(つまり、nilまたはfalseでない限り、設定を気にしないでください)。これにより、dbヒットは1つだけになります。次に、すべてのウェイトを30日前および日付別に検索します。これは[date, weights]という配列を返します。これは日付順に並べ替えられます。それから、各日付の換算された重みを集めるので、最終的には[weights on day 1], [weights on day 2], ...となります。

ここでは、配列からの日数にわたる値をweights_during_periodに格納して計算します。値を平坦化して平均値を計算します。

+0

お返事ありがとうございます。 @converted_weightsで何をすべきか分かりません。私はそれがconverted_weight値を含んでいるのを見ることができますが、それは呼び出しているXXX_day_weight_average呼び出しにnilを返しています。私のRubyの知識は非常に限定されています - '@converted_weights [-number_days ..- 1] .sum'は平均を返しますか? – jacoulter

+0

@jacoulter上記を参照してください - 私はコードを簡略化して修正し、いくつかの説明を追加しました。 – Zubin

+0

これを説明する時間をとってくれてありがとう。私はそれを動作させましたが、メソッドが呼び出されるたびにデータベースにヒットしています(これは期待されています)。必要な範囲を呼び出して呼び出し元のWebページで使用できるインスタンス変数をロードする方法はありますか? – jacoulter

関連する問題