RollupProperty: NotionRubyMapping 解説 (39)

はじめに

NotionRubyMapping 解説の第39回目です。今日は Rollup プロパティの追加です。データベースは共通なものを使い回します。

Database properties (32-39)

irb(main):002> db = Database.find "https://www.notion.so/hkob/cad035c49e5346e783
31cb5d05cbc754?v=a03e96ed79ad4d35808e7a08583396a0&pvs=4"
=> NotionRubyMapping::Database-cad035c49e5346e78331cb5d05cbc754

Database update の修正

今回、RollupProperty の作成でもうまく update ができない現象に遭遇しました。Notion API に渡す payload を調べてみると、以下のように値がうまく反映されていません。

print db.save dry_run: true
#!/bin/sh
curl -X PATCH 'https://api.notion.com/v1/databases/cad035c49e5346e78331cb5d05cbc754' \
  -H 'Notion-Version: 2022-06-28' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"properties":{"Rollup":{"rollup":{"function":null,"relation_property_name":null,"rollup_property_name":null}}}}'=> nil

明かに property_schema_json の作成に失敗していることがわかります。該当箇所を調べると以下のようになっていました。

    # @return [Hash] created json
    # @param [Object] others
    def update_property_schema_json(*others)
      others.compact.reduce({}) { |hash, o| hash.merge o.update_property_schema_json }.merge @json
    end

せっかく作成したものを既存の @json で上書きしてしまっていました。reverse_merge してもいいのですが、わかりにくくなるので素直に入れ替えました。

    # @return [Hash] created json
    # @param [Object] others
    def update_property_schema_json(*others)
      @json.merge(others.compact.reduce({}) { |hash, o| hash.merge o.update_property_schema_json })
    end

このバージョンを NotionRubyMapping 0.8.4 としてリリースしました。

RollupProperty

気を取り直して、RollupProperty を作成してみます。まず、RollupProperty を追加し、rp1 に代入しておきます。

irb(main):003> rp1 = db.add_property RollupProperty, "Rollup"
=>
#<NotionRubyMapping::RollupProperty:0x00000001209b8400

RollupProperty は関連するリレーション、対応するプロパティ名、利用する関数を設定する必要があります。それぞれメソッドが用意されています。

irb(main):004> rp1.relation_property_name = "One Way Relation"
=> "One Way Relation"
irb(main):005> rp1.rollup_property_name = "タグ"
=> "タグ"
irb(main):006> rp1.function = "show_original"
=> "show_original"
irb(main):008> db.save
=> NotionRubyMapping::Database-cad035c49e5346e78331cb5d05cbc754

One Way Relation へのロールアップが正しく生成されています。

Rollup

なお、function には以下のものが設定できます。ただし、どれが利用可能かについては、リレーション先のプロパティの型に依存します。これについては、Notion API 活用術の書籍 87 ページに詳しくまとめていますので、興味がある方はそちらをご覧ください。

  • average
  • checked
  • count_per_group
  • count
  • count_values
  • date_range
  • earliest_date
  • empty
  • latest_date
  • max
  • median
  • min
  • not_empty
  • percent_checked
  • percent_empty
  • percent_not_empty
  • percent_per_group
  • percent_unchecked
  • range
  • unchecked
  • unique
  • show_original
  • show_unique
  • sum

FormulaProperty

先日、うまく設定できなかった FormulaProperty に再挑戦してみます。今回は dry_run でうまく動くことを確認してから、save しました。

irb(main):009> fp = db.add_property FormulaProperty, "Formula"
=>
#<NotionRubyMapping::FormulaProperty:0x0000000103692810
...
irb(main):010> fp.formula_expression = "today()"
=> "today()"
irb(main):011> print db.save dry_run: true
#!/bin/sh
curl -X PATCH 'https://api.notion.com/v1/databases/cad035c49e5346e78331cb5d05cbc754' \
  -H 'Notion-Version: 2022-06-28' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"properties":{"Formula":{"formula":{"expression":"today()"}}}}'=> nil
irb(main):012> db.save
=> NotionRubyMapping::Database-cad035c49e5346e78331cb5d05cbc754

今回は正しく設定できました。

Formula

おわりに

今回は、RollupProperty を生成しました。今回の property schema object の生成部分を修正したので、FormulaProperty も無事に動作することができました。

RollupProperty のマニュアルはこちらです。

RollupProperty

NotionRubyMapping解説