はじめに
NotionRubyMapping 解説の第39回目です。今日は Rollup プロパティの追加です。データベースは共通なものを使い回します。
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 へのロールアップが正しく生成されています。
なお、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
今回は正しく設定できました。
おわりに
今回は、RollupProperty を生成しました。今回の property schema object の生成部分を修正したので、FormulaProperty も無事に動作することができました。
RollupProperty のマニュアルはこちらです。