2011-12-27 81 views
1

我將Highcharts合併到我的Rails 3/Ruby 1.8.7項目中,使用Railscast第223集作爲起點。如何拒絕數組中的元素?

我想繪製一個用戶在前四周的體重。有些時候用戶可能不會輸入他們的體重,我希望圖表跳過這些日期。

我嘗試使用回答這個問題#1:

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 – 2011-12-27 13:43:35

回答

1

我會重構代碼使用不規則的時間間隔,而不是期待用戶每天填寫值。

生成日期時間(毫秒)和值的對,即每個點具有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 2011-12-27 19:15:30

0

變化self.weight_on方法

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 

這樣做將會使將由.reject(&:zero?)被拒絕不具有重量數據return 0.0(浮點)的那些日期。所以只會顯示有重量數據的日期。

希望有幫助。

+0

我想是這樣的,但問題是,生成日期與pointStart選項。生成的數組剛好填滿第一個日期,依此類推。正確的方法顯示在下面的@Henrik的答案中。謝謝! – jacoulter 2011-12-27 19:19:59

1

你不應該從數組拒絕價值觀,讓他們爲nil(所以他們在後來JSON null)。此外,使用to_json,不inspect

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

一些更refactors:

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 2011-12-27 19:16:32