1

私のRails3.2アプリでは、コネクタhas_manyインシデントがあります。

特定のコネクタのすべてのインシデントを取得するには、これを行うことができます:(コンソールで)

c = Connector.find(1) # c.class is Connector(id: integer, name: string, ...
i = c.incidents.all # all good, lists incidents of c

しかし、どうすれば多くのコネクタのすべてのインシデントを取得できますか?

c = Connector.find(1,2) # works fine, but c.class is Array
i = c.incidents.all #=> NoMethodError: undefined method `incidents' for #<Array:0x4cc15e0>

簡単なはずです!でもわからない!

これが私のstatistics_controller.rbの完全なコードです

class StatisticsController < ApplicationController
  def index

    @connectors = Connector.scoped

    if params['connector_tokens']
      logger.debug "Following tokens are given:  #{params['connector_tokens']}"
      @connectors = @connectors.find_all_by_name(params[:connector_tokens].split(','))
    end

    @start_at = params[:start_at] || 4.weeks.ago.beginning_of_week
    @end_at = params[:end_at] || Time.now


    #@time_line_data = Incident.time_line_data( @start_at, @end_at, 10) #=> That works, but doesn’t limit the result to given connectors
    @time_line_data = @connectors.incidents.time_line_data( @start_at, @end_at, 10) #=> undefined method `incidents' for #<ActiveRecord::Relation:0x3f643c8>
    respond_to do |format|
      format.html # index.html.haml
    end
  end
end

以下の最初の3つの回答を参照して編集してください。

素晴らしい!以下のコードで、特定のコネクタのすべてのインシデントを含む配列を取得します。

c = Connector.find(1,2)
i = c.map(&:incidents.all).flatten

しかし、理想的には、配列の代わりにActive Recordsオブジェクトを取得したいと思います。これは、以下のメソッドでわかるように、オブジェクトでwhere()を呼び出したいためですtime_line_data

アレイで目標を達成することはできましたが、戦略全体を変更する必要があります...

これは私time_line_data()のインシデントモデルmodels/incidents.rbです

      def self.time_line_data(start_at = 8.weeks.ago, end_at = Time.now, lim = 10)
        total = {}
        rickshaw = []
        arr = []
        inc = where(created_at: start_at.to_time.beginning_of_day..end_at.to_time.end_of_day)

        # create a hash, number of incidents per day, with day as key
        inc.each do |i|
          if total[i.created_at.to_date].to_i > 0
            total[i.created_at.to_date] += 1
          else
            total[i.created_at.to_date] = 1
          end
        end
        # create a hash with all days in given timeframe, number of incidents per day, date as key and 0 as value if no incident is in database for this day
        (start_at.to_date..end_at.to_date).each do |date|
          js_timestamp = date.to_time.to_i
          if total[date].to_i > 0
            arr.push([js_timestamp, total[date]])
            rickshaw.push({x: js_timestamp, y: total[date]})
          else
            arr.push([js_timestamp, 0])
            rickshaw.push({x: js_timestamp, y: 0})
          end
        end

        { :start_at => start_at,
          :end_at => end_at,
          :series => rickshaw #arr


}
end
4

2 に答える 2

2

参照:-マップ

c = Connector.find(1,2)
i = c.map(&:incidents.all).flatten
于 2012-10-18T11:46:38.657 に答える
2

タイム ライン データのみに関心があるように見えるので、前に示したマップの例をさらに拡張できます。

@time_line_data = @connectors.map do |connector|
  connector.incidents.map do |incident|
    incident.time_line_data(@start_at, @end_at, 10)
  end
end

これにより、コネクタのコレクション内のすべてのインシデントに対する time_line_data メソッド呼び出しのすべての戻り値がマップ/収集されます。

于 2012-10-18T12:00:57.880 に答える