3

私はプログラミングが初めてですが、ここにあります.postgresqlデータベースからデータを取得し、jqPlotチャートに要約を表示するレールアプリを作成しようとしていますが、クエリに問題があります. このようにフォーマットされるチャートの配列が必要です total_durations=[["Jan", 3456],["Feb", 21], etc]

私のデータベース の使用状況データと呼ばれるテーブルは次のとおりです。

╔═══════════════╦═════════════╦═════════════════════╦════════════════╗
║   record_id   ║   user_id   ║     submit_time     ║   duration     ║
╠═══════════════╬═════════════╬═════════════════════╬════════════════╣
║             1 ║           6 ║ 2012-09-19 22:18:58 ║      45        ║
║             2 ║           1 ║ 2012-09-19 22:45:59 ║      0         ║
║             3 ║           5 ║ 2012-09-20 01:57:52 ║      3987      ║
║             4 ║           8 ║ 2012-09-18 03:47:53 ║      34        ║
║             5 ║           9 ║ 2013-01-26 20:38:03 ║      678       ║
║             6 ║           1 ║ 2013-01-26 23:41:44 ║      56        ║
║             7 ║           2 ║ 2013-01-27 02:10:41 ║      100       ║
╚═══════════════╩═════════════╩═════════════════════╩════════════════╝

1.部分的な方法
私はModel usagedata.rbを持っています:

class Usagedata < ActiveRecord::Base     
  def self.by_month     
   h = Usagedata.calculate(:sum, :duration, :conditions => {     
     :submit_time => (Time.now.all_year) },    
     :order => "EXTRACT(month FROM submit_time)",     
     :group => ["EXTRACT(month FROM submit_time)","EXTRACT(year FROM submit_time)"])  

  end 
end    

コントローラーの使用法data_controller.rb:

class UsagedataController < ApplicationController     
    def index    
    end
    private
    def set_usagedata
      @usagedata = Usagedata.find(params[:id])
    end
    def usagedata_params
      params[:usagedata]
    end
end

そして、index.html.hamlを表示します:

%br=h = Usagedata.by_month

ビューの出力は次のとおりです。

{[1.0, 2013.0]=>135776897, [2.0, 2013.0]=>100620585, [3.0, 2013.0]=>162980319, [4.0, 2013.0]=>26916589, [5.0, 2013.0]=>18793323, [6.0, 2013.0]=>9250440, [7.0, 2013.0]=>5011563, [12.0, 2012.0]=>24092}

total_durations=[["Jan", 3456],["Feb", 21], etc]月がsubmit_timeフィールドから取得され、他の数値が毎月の期間の合計であるデータベーステーブルに従って配列を取得するにはどうすればよいですか。または、配列のようなものでもtotal_durations=[["1.0, 2013.0", 135776897],["2.0, 2013.0", 100620585], etc]役立ちます。

2.
db で必要なものを出力することができた部分的な方法:

select to_char(submit_time,'Mon') as mon,
   extract(year from submit_time) as yyyy,
   sum("duration") as "Total_Duration"
from usagedata
group by 1,2

Railsの配列へのクエリの出力を取得するにはどうすればよいですか?

私は html.haml ページでこれを試しました:

%br=Usagedata.select("duration, extract (month from submit_time) as month, extract(year from submit_time) as year, SUM(submit_time) as total").group(1,2)

しかし、それは単なる印刷行です:

#<ActiveRecord::Relation::ActiveRecord_Relation_Usagedata:0x007f1c10997518>

また、次のようにコントローラーに追加しようとしました:

@fetch = []
  Usagedata.select("extract (month from submit_time) as month, extract(year from submit_time) as year, SUM(duration)").group_by(1,2).each do |ph|
    @fetch << [ph.month.to_f, ph.year, ph.sum]
end

しかし、これは私にエラーを与えているだけです:

PG::Error: ERROR: column "usagedata.submit_time" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT extract (month from submit_time) as month, extract(ye... ^ : SELECT extract (month from submit_time) as month, extract(year from submit_time) as year, SUM(duration) FROM "usagedata"

3.
ここで説明されている部分的な方法: http://railsforum.com/viewtopic.php?id=27205
controller.rb:

    @usagedata_groups = Usagedata.find(:all,
    :select => 'submit_time, wall_duration, id', 
    :conditions => {:machine_name_id => ["1"]},).group_by{|usagedata| usagedata.submit_time.beginning_of_month}

    @fetch = []
    Usagedata.find(:all,
    :select => 'submit_time, wall_duration, id', 
    :conditions => {:machine_name_id => ["1"]},).group_by{|usagedata| usagedata.submit_time.beginning_of_month}.keys.sort.each do |month|
       @fetch << month.strftime("%B %Y")
       @fetch << month.collect(&:wall_duration).sum
    end

index.html.haml

  %table
    %tr         
     %th    
     - @usagedata_groups.keys.sort.each do |month|        
       %tr
        %td
          #{month.strftime("%B %Y")}          
        %td
          #month.collect(&:wall_duration).sum 
  %table
    %tr
     %th Show @fetch content:    
     - @fetch.each do |co|
       %tr 
        %td=co

@fetch << month.collect(&:wall_duration).sumコントローラーの行なしの出力:

February 2013     98503443
March 2013            162980319
April 2013            26916589
May 2013              18793323
June 2013             9250440
July 2013             5399525

Show @fetch content
February 2013
March 2013
April 2013
May 2013
June 2013
July 2013

その行でエラーが発生します:

NoMethodError in UsagedataController#index
undefined method `collect' for Fri, 01 Feb 2013 00:00:00 UTC +00:00:Time

助けてください!

4

1 に答える 1