4

さまざまなイベントとそのステータスを追跡するRailsアプリケーションに取り組んでいます。

これが私のStatusモデルです:

class Status < ActiveRecord::Base
  attr_accessible :value

  has_many :events
end

追加のステータスタイプを追加するためのインターフェイスがあります。

私のEventモデルは次のようになります。

class Event < ActiveRecord::Base
  attr_accessible :status_id

  belongs_to :status

  class << self
    Status.all.each do |status|
      define_method(status.value.downcase) do
        send("where", :status_id => Status.find_by_value(status.value.downcase))
      end
    end
  end
end

たとえば、3つの異なるステータス値があります:、、、Outageなど。SlowError

これで私はできる:

Event.outage

また:

Event.slow

そして、私はActiveRecord::Relationそのステータスのすべてのイベントのを取り戻します。これは期待どおりに機能します。

Highchartsを使用して動的にいくつかのグラフを生成するビューがあります。これが私のビューコードです:

<script type="text/javascript" charset="utf-8">
  $(function () {
    new Highcharts.Chart({
        chart: { renderTo: 'events_chart' },
        title: { text: '' },
        xAxis: { type: 'datetime' },
        yAxis: {
          title: { text: 'Event Count' },
          min: 0,
          tickInterval: 1
        },
        series:[
              <% { "Events" => Event,
                   "Outages" => Event.outage, 
                   "Slowdowns" => Event.slow, 
                   "Errors" => Event.error,
                   "Restarts" => Event.restart }.each do |name, event| %>
            {
              name: "<%= name %>",
              pointInterval: <%= 1.day * 1000 %>,
              pointStart: <%= @start_date.to_time.to_i * 1000 %>,
              pointEnd: <%= @end_date.to_time.to_i * 1000 %>,
              data: <%= (@start_date..@end_date).map { |date| event.reported_on(date).count}.inspect %>
            },
            <% end %>]
          });
        });
</script>

<div id="events_chart"></div>

Statusデータベースからのタイプのリストを使用して、このハッシュを動的に生成したいと思います。

<% { 
     "Outage" => Event.outage, 
     "Slow" => Event.slow, 
     "Error" => Event.error,
     "Restart" => Event.restart }.each do |name, event|
%>

このようなものを使用して:

hash = Status.all.each do |status|
  hash.merge("#{status.value}" => Event) ||= {}
end

eachハッシュを呼び出してチャートを生成したいと思います。ただし、これはハッシュを提供しませんが、それ自体Arrayと同じように、ハッシュを提供Status.allします。

4

1 に答える 1

2

これは私がそれを行う方法です、Enumerable#each_with_objectそしてObject#send

hash = Status.select(:value).each_with_object({}) do |s, h|
  h[s.value.upcase] = Event.send s.value.downcase
end
于 2013-01-10T04:05:03.980 に答える