はじめに
NotionRubyMapping 解説の第4回目です。昨日はページを取得したので、似た部分が多いデータベースを取得してみます。ちょうど機能作った「作業ページデータベース」があるので、これを取得してみます。
データベースの取得
このデータベースの公開 URL は以下のようになります。ここで site のすぐ後ろの32桁の16進数が database_id
となります。一方、?v=
の後ろはビューの id に相当しますが、現在 Notion API からビューに関して何かできる機能はありません。
https://hkob.notion.site/f50fe9be119c41d1b2e0b99bbab471a8?v=56d3ff0f3fd340e1b7e4bb14cef6202b&pvs=4
NotionRubyMapping では Database
クラスの find
クラスメソッドで Notion データベースを取得できます。ページの取得と同様に database_id を取り出すのは面倒なので、上のデータベースの URL をそのまま渡しても自動的に database_id
を取り出してくれます。ここでは、以下のコマンドでデータベースを取得してみます。database_id
や database_url
は文字列なので、 ""
でくくってください。
irb(main):002> db = Database.find "https://hkob.notion.site/f50fe9be119c41d1b2e0 b99bbab471a8?v=56d3ff0f3fd340e1b7e4bb14cef6202b&pvs=4" => NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8
NotionRubyMapping::Database のオブジェクトが取得できていることがわかります。
データベースオブジェクトに対するメソッド
ページと同様にここでは代表的なメソッドを紹介してみます。
1. database_title: データベースタイトルを取得
database_title
はデータベースのタイトルを取得するメソッドです。page は title でテキストのみが取得できたのですが、こちらは後日解説する予定の RichTextArray が返ってきています。あまり対称性がよくないですね。タイトルに装飾をすることはほとんどないので、こちらもテキストだけでよさそうです。後で修正してしまいたいと思います。
irb(main):004> db.database_title => #<NotionRubyMapping::RichTextArray:0x000000012677b678 @key="title", @rich_text_objects= [#<NotionRubyMapping::TextObject:0x0000000126755068 @options= {"plain_text"=>"作業ページデータベース", "bold"=>false, "italic"=>false, "strikethrough"=>false, "underline"=>false, "code"=>false, "color"=>"default", "href"=>nil}, @text="作業ページデータベース", @type="text", @will_update=false>], @will_update=nil>
2. parent_id: 親の ID を取得
parent_id
はページの親の ID を取得するメソッドです。
irb(main):005> db.parent_id => "e74f18cd-f3bc-464f-b551-7cf7c895cc4a"
3. parent: 親の Notion オブジェクトを取得
parent
はページの親のオブジェクトを取得するメソッドです。通常、データベースの親はページか workspace になることがほとんどなのですが、これは Database になっていました。唯一の例外である Wiki データベースですね。通常データベースの中にデータベースを入れることはできないのですが、Wiki データベースだけはデータベースを子供に持つことができます。
irb(main):006> db.parent => NotionRubyMapping::Database-e74f18cdf3bc464fb5517cf7c895cc4a
4. created_time: 作成時刻プロパティを取得
created_time
はページの作成時刻プロパティを取得するメソッドです。ページでも説明しましたが、inspect が実装されていないので、中身が見えてしまってカッコ悪いです。
irb(main):007> db.created_time => #<NotionRubyMapping::CreatedTimeProperty:0x00000001263d7b20 @base_type=:page, @create=false, @json="2024-02-25T11:23:00.000Z", @name="__timestamp__", @new_name=nil, @property_cache=nil, @property_id=nil, @query=nil, @remove=false, @will_update=false> i
5. last_edited_time: 更新時刻プロパティを取得
last_edited_time
はページの更新時刻プロパティを取得するメソッドです。こちらも同じです。
irb(main):008> db.last_edited_time => #<NotionRubyMapping::LastEditedTimeProperty:0x0000000120a7d3e0 @base_type=:page, @create=false, @json="2024-02-25T11:25:00.000Z", @name="__timestamp__", @new_name=nil, @property_cache=nil, @property_id=nil, @query=nil, @remove=false, @will_update=false>
6. page?, database?, block?
page?
, database?
, block?
はそのオブジェクトが page なのか、database なのか、block なのかを聞くメソッドです。今回の場合、database?
のみが true を返します。
irb(main):009> db.page? => false irb(main):010> db.database? => true irb(main):011> db.block? => false
7. new_record?
new_record? は Rails と同じで Notion 側に存在しない Page オブジェクトである時に true を返すメソッドです。基本的には Database.new
で作成したオブジェクトの時 true になります。これは後日解説します。
irb(main):012> db.new_record? => nil
8. properties
properties は database のプロパティをまとめて管理する PropertyCache オブジェクトを返します。こちらについては、後日プロパティの解説の時に説明します。ページのプロパティとデータベースのプロパティは Ruby のクラスは同じものですが、扱うものが全く異なります。後日解説します。
irb(main):013> db.properties => PropertyCache
9. icon
icon はページアイコンの内容を示すハッシュを返すメソッドです。このページはアイコンがないので、nil になっています。
irb(main):014> db.icon => nil
10. set_icon emoji: a_emoji または set_icon url: a_url
set_icon は絵文字または外部 URL によりアイコンを設定するメソッドです。ただし、オブジェクトの設定をするだけで、後述する save をした時に初めて Notion にデータが送られて変更されます。ページと全く同じです。
irb(main):015> db.set_icon emoji: "2️⃣" => NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8
11. save または save dry_run: true
ページと同様に save dry_run: true とすると実際に Notion に作業する代わりにスクリプトが表示されます。
irb(main):016> print db.save dry_run: true #!/bin/sh curl -X PATCH 'https://api.notion.com/v1/databases/f50fe9be119c41d1b2e0b99bbab471a8' \ -H 'Notion-Version: 2022-06-28' \ -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \ -H 'Content-Type: application/json' \ --data '{"icon":{"type":"emoji","emoji":"2️⃣"}}'=> nil
db.save とすると Notion のページアイコンが変更されました。
irb(main):017> db.save => NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8
保存した後、Notion API はページ情報を返却してくれます。NotionRubyMapping では返却された情報で database オブジェクトの内容を再度アップデートします。このため、ここで db.icon
とすると変更されたアイコンの情報が正しく入っていることがわかります(先ほど取得した時は nil でした)。
irb(main):018> db.icon => {"type"=>"emoji", "emoji"=>"2️⃣"}
12. is_inline, is_inline = flag
データベースのみの特性として is_inline という属性があります。これを true にして保存するとデータベースがインラインに設定されます。
irb(main):021> db.is_inline = true => true irb(main):022> db.save dry_run: true => "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/databases/f50fe9be119c41d1b2e0b99bbab471a8' \\\n -H 'Notion-Version: 2022-06-28' \\\n -H 'Authorization: Bearer '\"$NOTION_API_KEY\"'' \\\n -H 'Content-Type: application/json' \\\n --data '{\"is_inline\":true}'" irb(main):023> db.save => NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8 irb(main):024> db.is_inline => true
13. description, description = text_info
もう一つデータベースのみの特性は description です。text_info には RichTextArray に相当するものが設定できるのですが、詳細は後日解説します。
irb(main):025> db.description = "データベースの説明" => "データベースの説明" irb(main):026> db.save dry_run: true => "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/databases/f50fe9be119c41d1b2e0b99bbab471a8' \\\n -H 'Notion-Version: 2022-06-28' \\\n -H 'Authorization: Bearer '\"$NOTION_API_KEY\"'' \\\n -H 'Content-Type: application/json' \\\n --data '{\"description\":[{\"type\":\"text\",\"text\":{\"content\":\"データベースの説明\",\"link\":null},\"plain_text\":\"データベースの説明\",\"href\":null}]}'" irb(main):027> db.save => NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8 irb(main):028> db.description => #<NotionRubyMapping::RichTextArray:0x0000000125e5aff8 @key="description", @rich_text_objects= [#<NotionRubyMapping::TextObject:0x0000000126499428 @options= {"plain_text"=>"データベースの説明", "bold"=>false, "italic"=>false, "strikethrough"=>false, "underline"=>false, "code"=>false, "color"=>"default", "href"=>nil}, @text="データベースの説明", @type="text", @will_update=false>], @will_update=false>
おわりに
昨日の記事を見た人は昨日の記事とほとんど同じで手抜きだと思われたかもしれません。実際ほとんどの部分が共通だったと思います。実際にはほとんどのメソッドが Page および Database の共通の親クラスである Base に定義されているためです。明日は同じように Base の子クラスである Block を紹介するつもりですが、こちらはあまり共通部分はありません。
データベースに関するマニュアルはこちら hkob.notion.site