2011-12-27 8 views
1

私はRailstarのエピソード223を出発点として、私のRails 3/Ruby 1.8.7プロジェクトにHighchartsを取り入れています。配列から要素を拒否する方法は?

私は過去4週間にわたってユーザーの体重をグラフ化しようとしています。ユーザーが自分の体重を入力しなくてもよい日があり、その日付をスキップするようにしたい場合もあります。

私はこのStackOverflowの質問に対する答えは使用してみました:エントリなし日付に割り当てられている

Highcharts - Rails array includes empty date entries

を、私はその重み値にOPで述べた同じ悩みを抱えています。要するに、重みのない日付は、配列に割り当てられており、次の重み値が見つかる。

ここに私のチャートのシリーズのオプションからコードです:

series: [{ 
     name: "Daily Weight", 
     pointInterval: <%= 1.day * 1000 %>, 
     pointStart: <%= 4.weeks.ago.to_i * 1000 %>, 
     data: <%= (4.weeks.ago.to_date..Date.today).map { |date| Weight.weight_on(date, current_user.id).to_f}.reject(&:zero?).inspect %> 
    }] 

そしてここでは、体重モデルからweight_on機能です:

def self.weight_on(date, user_id) 
    weight = Weight.find_by_entry_date_and_user_id(date, user_id) 
    unless weight.nil? 
    return weight.weight_entry 
    end 
end 

何が起こっていることは、日付/体重配列がされているときであるように見えます作成された日付は、加重値が返されるまで保持されます。次の日付に反復する前に、日付と重量(配列内の日付に対応しない)が配列に追加されます。

どのようにして日付を拒否することもできますか?その日付で重み値が見つからない場合は、その日付をスキップして配列に追加されないようにし、次の日付に移動するにはどうすればよいですか?

ありがとうございました!

+0

答えは正確ではありませんが、あなたのアプリで日付を繰り返し、毎日データベースを照会する代わりに、カレンダーテーブル[1]を作成してあなたのデータをそこに参加させてください。 [1] http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html –

答えて

1

コードを再構成すると、ユーザーが毎日値を入力するのではなく、不規則な間隔で再構成されます。

datetime(ミリ秒単位)と値のペア、つまりxとyの値を持つ各ポイントの配列を生成します。

new Highcharts.Chart({  
    chart: { 
    renderTo: 'container', 
    type: 'line' 
    }, 

    xAxis: { 
    type: 'datetime', 
    maxZoom: 7 * 24 * 3600000, // one week 

    }, 

    series: [ 

    { 
    name: "Weight", 
      data: [[1295954580000,3.9],[1297411200000,6.6],1298366040000,5.5],1318931520000,7.7],[1320143220000,2.2],[1320846960000,5.6],[1321356600000,2.1]] 
    } 
}); 

http://www.highcharts.com/demo/spline-irregular-time

+0

はい、それはそれを行う方法です。私はHighchartsの不規則な間隔の例を見てこれを考え出しました。ミリ秒を使用すると、動的にアレイを作成するのがはるかに簡単になります。 dateTimeLabelFormatsを正しく使用して、ミリ秒の値が月、日、年として表示されるようにする必要があります。ありがとう! – jacoulter

0

変更.reject(&:zero?)によって拒否されますreturn 0.0(フロート)に重量データを持っていない、これらの日を行いますそう

def self.weight_on(date, user_id) 
    weight = Weight.find_by_entry_date_and_user_id(date, user_id) 
    if weight.nil? 
    return 0.0 
    else 
    return weight.weight_entry 
    end 
end 

からself.weight_on方法。したがって、重量データを持つ日付のみが表示されます。

うまくいけば助けてください。

+0

私はこれを試しましたが、問題は日付が生成されることですpointStartオプションを使用します。生成された配列は最初の日付に対して塗りつぶされます。下の@Henrikの答えに正しい方法が示されています。ありがとう! – jacoulter

1

あなたはnilとしてそれらを残して(そう、彼らは後でnull JSONである)、配列から値を拒否してはなりません。また、to_jsonを、使用しないinspect

<%= date_intervals.map { |date| Weight.weight_on(date, current_user.id) }.to_json %> 

いくつかのより多くのリファクタリング:

def self.weight_on(date, user_id) 
    Weight.find_by_entry_date_and_user_id(date, user_id).try(:weight_entry) 
end 

しかし、いずれにしても、あなたがUserオブジェクトにそれを行うことができるはずです(これhas_many :weights):

user.weight_on(date) 
+0

再考の提案をありがとう。私は今、Userオブジェクトを使用して関連する重みデータを取得しています。 – jacoulter

関連する問題