高木のブログ

PixelaをActiveRecordのように使う試み

2021/04/05

※下書きにずっと放置してあって、記事も実装も中途半端な状態だけど一旦公開しておく

Pixelaの利用シーンの例として「“日”系列データベース」があったので、その使い方でやるとしたらどうやるか試してみた話。
ActiveRecordみたいに使えたらいいなと思ったのでサクッと作ってみた。

最初に言い訳として雑に作ってある。
とりあえず、findとwhereだけ実装した。
createは力尽きたので断念。

require 'pixela'

class PixelaRecord
  attr_accessor :date, :quantity

  def initialize(date:, quantity:)
    @date = date
    @quantity = quantity.to_i
  end

  class << self
    def find(date = Date.today)
      response = client.get_pixel(graph_id: graph_id, date: date)
      new(date: date, quantity: response.quantity)
    end

    def where(from: nil, to: nil)
      dates = client.get_pixel_dates(graph_id: graph_id, from: from, to: to)
      dates.map do |date|
        response = client.get_pixel(graph_id: graph_id, date: date)
        new(date: date, quantity: response.quantity)
      end
    end

    private

    def client
      @client = Pixela::Client.new(username: 'takagi', token: 'hogehoge')
    end

    def graph_id
      self.name.downcase
    end
  end
end
class Distance < PixelaRecord
end
distance = Distance.find(Date.today)
puts "#{distance.date}: #{distance.quantity}km"
#=> 2020-11-21: 1km

distances = Distance.where(from: Date.parse('2020-10-01'), to: Date.parse('2020-10-31'))
distances.each do |distance|
  puts "#{distance.date}: #{distance.quantity}km"
end
#=> 2020-10-01: 56km
#=> 2020-10-02: 67km
#=> 2020-10-03: 72km
#=> 2020-10-04: 40km
#=> 2020-10-05: 14km
#=> 2020-10-06: 37km
#=> 2020-10-07: 82km
#=> 2020-10-08: 100km
#=> 2020-10-09: 58km
#=> 2020-10-10: 71km
#=> 2020-10-11: 77km
#=> 2020-10-12: 3km
#=> 2020-10-13: 4km
#=> 2020-10-14: 44km
#=> 2020-10-15: 80km
#=> 2020-10-16: 2km
#=> 2020-10-17: 10km
#=> 2020-10-18: 64km
#=> 2020-10-19: 15km
#=> 2020-10-20: 10km
#=> 2020-10-21: 51km
#=> 2020-10-22: 74km
#=> 2020-10-23: 3km
#=> 2020-10-24: 67km
#=> 2020-10-25: 38km
#=> 2020-10-26: 41km
#=> 2020-10-27: 19km
#=> 2020-10-28: 65km
#=> 2020-10-29: 46km
#=> 2020-10-30: 74km
#=> 2020-10-31: 94km

感想

N+1問題が発生している
API制限があるのかわからないが、なかったとしてもあまりよろしくないと思う。

備考

先にグラフは作成しておく。

$ curl -X POST https://pixe.la/v1/users/takagi/graphs -H 'X-USER-TOKEN:xxxx' -d '{"id":"distance","name":" 走行距離","unit":"km","type":"float","color":"sora","timezone":"Asia/Tokyo"}'
{"message":"Success.","isSuccess":true}

ytkg

Written by ytkg, Twitter, GitHub