0

データ形式のさまざまな順列を使用して、Chartkick の複数の折れ線グラフをレンダリングしようとしました。私はどこにも行きません。ここでデータを返すために使用しているメソッドの現在の反復を貼り付けますが、午前中ずっとこのバリエーションを試したことを知っています。

def trailing_seven_day_profit(id)
    user = User.find id
    jobs     = Job.select("id")
                 .where("billed != 0.0")
                 .where("start_date >= ?", Date.today - 1.week)
                 .where(user_id: id).to_a
    mon_sell = tue_sell = wed_sell = thu_sell = fri_sell = sat_sell = sun_sell = 0
    mon_cost = tue_cost = wed_cost = thu_cost = fri_cost = sat_cost = sun_cost = 0
    products = Product.where("job_id IN (?)", jobs)
    products.each do |p|
      if p.created_at.strftime("%a") == 'Mon'
        mon_sell += (p.price * p.quantity).to_f + (p.tax * (p.price * p.quantity)).to_f
        mon_cost += (p.quantity * p.cost).to_f
      elsif p.created_at.strftime("%a") == 'Tue'
        tue_sell += (p.price * p.quantity).to_f + (p.tax * (p.price * p.quantity)).to_f
        tue_cost += (p.quantity * p.cost).to_f
      elsif p.created_at.strftime("%a") == 'Wed'
        wed_sell += (p.price * p.quantity).to_f + (p.tax * (p.price * p.quantity)).to_f
        wed_cost += (p.quantity * p.cost).to_f
      elsif p.created_at.strftime("%a") == 'Thu'
        thu_sell += (p.price * p.quantity).to_f + (p.tax * (p.price * p.quantity)).to_f
        thu_cost += (p.quantity * p.cost).to_f
      elsif p.created_at.strftime("%a") == 'Fri'
        fri_sell += (p.price * p.quantity).to_f + (p.tax * (p.price * p.quantity)).to_f
        fri_cost += (p.quantity * p.cost).to_f
      elsif p.created_at.strftime("%a") == 'Sat'
        sat_sell += (p.price * p.quantity).to_f + (p.tax * (p.price * p.quantity)).to_f
        sat_cost += (p.quantity * p.cost).to_f
      elsif p.created_at.strftime("%a") == 'Sun'
        sun_sell += (p.price * p.quantity).to_f + (p.tax * (p.price * p.quantity)).to_f
        sun_cost += (p.quantity * p.cost).to_f
      end
    end
    @data = [
      ['Name', 'Day', 'Sell', 'Cost'],
      [user.name, 'Mon', mon_sell.round(2), mon_cost.round(2)],
      [user.name, 'Tue', tue_sell.round(2), tue_cost.round(2)],
      [user.name, 'Wed', wed_sell.round(2), wed_cost.round(2)],
      [user.name, 'Thu', thu_sell.round(2), thu_cost.round(2)],
      [user.name, 'Fri', fri_sell.round(2), fri_cost.round(2)],
      [user.name, 'Sat', sat_sell.round(2), sat_cost.round(2)],
      [user.name, 'Sun', sun_sell.round(2), sun_cost.round(2)]
    ]
    @data
  end

私のデータベースに関するいくつかの説明 - 仕事には多くの製品があります。商品レコードは、ジョブに追加されたときのアイテムのコスト、販売価格 (さまざま)、税金、数量、ジョブとの関係、アイテムの説明などを取得する在庫、およびいくつかのタイムスタンプを保持します。

したがって、3 つの製品を持つ Job #1 の場合、情報を表示するには Job.find(1).products.each が必要になります。

または、ここで取っているアプローチである Product.find("job_id in (?)", [array_of_job_ids]) 。

過去のある時点でこのレポートが機能していましたが、Google チャートを使用したすべての手動であり、コードはひどいものでした。そこで私は Chartkick を見つけました。私が行っていたものと比較して、ビューがいかにシンプルであるかが気に入っています。

今、レンダリングするものが何もありません。

ビューは次のように単純にする必要があります。

              <% @users.each do |u| %>
                <div class="widget-content">
                  <%= line_chart name: u.name, data: ReportMaker.new.trailing_seven_day_profit(u.id) %>
                </div>
              <% end %>

しかし、それは何もレンダリングしません。

as_json として試してみましたが、ハッシュとして試してみました。現在は配列形式ですが、データは表示されず、凡例も表示されません。

したがって、明らかに、何かが間違っています。しかし、「chartkick multi series format」のようなものをグーグルで検索すると、本当に役に立たない結果がたくさん得られます.Chartkickページのドキュメント(申し訳ありません)は最悪です.

彼は言い​​ます:

<%= line_chart [
  {name: "Series A", data: series_a},
  {name: "Series B", data: series_b}
] %>

それで、wtf series_a は次のように見えるはずですか? ジェイソン?ハッシュ?ARオブジェクト? 配列?

すべての例が示すように、「ジョブ数」や「created_at による製品のグループ化」などの単純なことは行っていません。

コレクションを反復処理し、値を取り出して結合し、データ セットをレンダリングする必要があります。

また、製品の未乾燥性.以下の各ブロックは私の心を傷つけます. それを乾かす方法についての指針を喜んで受け入れます:)

4

1 に答える 1

0

products.eachこのジョブはデータベースレベルで実行する必要があるため、ブロックは醜いです。次のようなものが必要です。

def trailing_seven_day_profit(id)
  Product.connection.select_all('
    SELECT u.name, DAYNAME(p.created_at) AS day, 
      p.price * p.quantity + p.tax * p.price * p.quantity AS sell, 
      p.quantity * p.cost AS cost
    FROM products p
    INNER JOIN jobs j ON j.id = p.job_id
    INNER JOIN users u ON u.id = j.user_id
    WHERE j.billed != 0 AND j.start_date >= CURDATE() - INTERVAL 1 WEEK
    WHERE u.id = #{id.to_i}
    GROUP BY DAYNAME(p.created_at)
  '
end

OPによる編集:

結果を取得するためにクエリを変更しました。

SELECT to_char(p.created_at, 'day') AS day_of_week,
               p.price * p.quantity + p.tax * p.price * p.quantity AS sell,
               p.quantity * p.cost AS total_cost
FROM products p
  INNER JOIN jobs j ON j.id = p.job_id
  INNER JOIN users u ON u.id = j.user_id
WHERE j.billed != 0 AND j.start_date >= CURRENT_DATE - INTERVAL '7 DAY' AND u.id = 242
GROUP BY to_char(p.created_at, 'day'), sell, total_cost

しかし、これはまったく間違ったものを出力します:

SQL クエリの結果

集計されたコストと販売価格を使用して、週の最後の 7 日間を個別の行として取得しようとしています。必要な Chartkick データを取得するために、ユーザーごとにこのクエリを取得します。私は DB ウィザードではありません。この可能な解決策についてもっと知りたいです。

コメントが長くなりすぎたので編集しました...

于 2015-09-21T17:19:12.143 に答える