はじめに
NotionRubyMapping 解説の第32回目です。今日からデータベースのプロパティの設定を解説します。Notion API では Property Object や Property Schema Object などの JSON が必要となりますが、NotionRubyMapping ではそのあたりは内部に隠蔽しているので、それらの知識は必要としません。ページはこちらに用意しました。明日以降も使えるように同期ブロックの中にデータベースを入れてあります。明日以降のページにもこの同期ブロックを入れておきます。
database.rename_property, remove_properties (32)
今日はページではなく、中のデータベースを取得します。データベースをフルページで開き、その URL を使ってデータベースを取得します。
irb(main):002> db = Database.find "https://www.notion.so/hkob/55bed716d15f408b81d5815be09faf45?v=a120c88f71664a9cbf96827f8042c621&pvs=4" => NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45
rename_property
データベースのプロパティの名前を変更するには、rename_property メソッドを利用します。ここでは、名前を Name に、タグを Tag に変更してみます。メソッドだけでは API 呼び出しはされず、その後 save をしたところで初めて API 呼び出しが行われます。
irb(main):003> db.rename_property "名前", "Name" => NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45 irb(main):004> db.rename_property "タグ", "Tag" => NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45 irb(main):005> db.save => NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45
実行した結果以下のようにプロパティの名前が書きかわっています。
remove_properties
プロパティを削除するには remove_properties
メソッドを使います。複数形になっていることからわかるように、 db.remove_properties "A", "B"
のように複数のプロパティを一気に削除することができます。今回は、Tag プロパティを消してみます。
db.remove_properties "Tag" => [#<NotionRubyMapping::MultiSelectProperty:0x000000010e25d8e8 @base_type=:database, @create=false, @json={"options"=>[]}, @name="Tag", @new_name=nil, @property_cache=PropertyCache, @property_id="BUEV", @query=nil, @remove=true, @will_update=true>]
ここで、save をしてみましたが、以下のようなエラーになりました。
irb(main):009> db.save /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/database.rb:162:in `rescue in update': {"object"=>"error", "status"=>400, "code"=>"validation_error", "message"=>"名前 is not a valid property schema", "request_id"=>"f91a01fc-b0ec-465e-b9d3-f2b39466a3ae"} by {"properties"=>{"名前"=>{"name"=>"Name"}, "タグ"=>{"name"=>"Tag"}, "Tag"=>nil}} (StandardError) from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/database.rb:159:in `update' from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:319:in `save' from (irb):9:in `<main>' from <internal:kernel>:187:in `loop' from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/irb-1.11.1/exe/irb:9:in `<top (required)>' from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `load' from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `<main>' /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:345:in `update_json': {"object"=>"error", "status"=>400, "code"=>"validation_error", "message"=>"名前 is not a valid property schema", "request_id"=>"f91a01fc-b0ec-465e-b9d3-f2b39466a3ae"} (StandardError) from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/database.rb:160:in `update' from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:319:in `save' from (irb):9:in `<main>' from <internal:kernel>:187:in `loop' from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/irb-1.11.1/exe/irb:9:in `<top (required)>' from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `load' from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `<main>'
Notion API に送っている JSON を確認したところ、先ほどの Rename の呼び出しのための Payload が残ってしまっていました。
irb(main):011> print db.save dry_run: true #!/bin/sh curl -X PATCH 'https://api.notion.com/v1/databases/55bed716d15f408b81d5815be09faf45' \ -H 'Notion-Version: 2022-06-28' \ -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \ -H 'Content-Type: application/json' \ --data '{"properties":{"名前":{"name":"Name"},"タグ":{"name":"Tag"},"Tag":null}}'=> nil
一度、NotionCache をクリアしてから、再度 database を取り出して削除してみたところ、無事にプロパティが削除されました。この辺りは連続しても処理が続けられるようにコードを修正していきたいと思います。
irb(main):019> NotionCache.instance.clear_object_hash => {} irb(main):020> db = Database.find "https://www.notion.so/hkob/55bed716d15f408b81 d5815be09faf45?v=a120c88f71664a9cbf96827f8042c621&pvs=4" => NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45 irb(main):021> db.remove_properties "Tag" => [#<NotionRubyMapping::MultiSelectProperty:0x000000010e25faa8 @base_type=:database, @create=false, @json={"options"=>[]}, @name="Tag", @new_name=nil, @property_cache=PropertyCache, @property_id="BUEV", @query=nil, @remove=true, @will_update=true>] irb(main):022> db.save => NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45
この処理によって Tag が削除されました。
おわりに
今回は、プロパティの名称変更と削除を解説しました。明日はタグを追加する add_property を解説します。
rename_property と remove_properties のマニュアルはこちらです。