RelationProperty: NotionRubyMapping 解説 (38)

はじめに

NotionRubyMapping 解説の第38回目です。今日は Relation プロパティの追加です。データベースは共通なものを使い回します。また、one-way と two-way の関連用に二つデータベースを追加しました。それぞれ owdb と twdb で読み込みをしておきます。

Database properties (32-38)

irb(main):002> db = Database.find "https://www.notion.so/hkob/cad035c49e5346e783
31cb5d05cbc754?v=a03e96ed79ad4d35808e7a08583396a0&pvs=4"
=> NotionRubyMapping::Database-cad035c49e5346e78331cb5d05cbc754
irb(main):003> owdb = Database.find "https://www.notion.so/hkob/5c0f2cc96679450c
8c9498cd130e015f?v=7a25bec6b89f469da8a980ca39a315e7&pvs=4"
=> NotionRubyMapping::Database-5c0f2cc96679450c8c9498cd130e015f
irb(main):004> twdb = Database.find "https://www.notion.so/hkob/f80ec5b49dee4223
a65c3837a35f2f97?v=3fc4228d0fc8481e8ccc136ebb572326&pvs=4"
=> NotionRubyMapping::Database-f80ec5b49dee4223a65c3837a35f2f97

RelationProperty (One way relation)

まず、RelationProperty を追加し、rp1 に代入しておきます。

irb(main):005> rp1 = db.add_property RelationProperty, "One Way Relation"
=>
#<NotionRubyMapping::RelationProperty:0x000000011f8f00a0

FormulaProperty は replace_relation_database でリレーションするデータベース ID を設定できます。片方行のみの場合には、type: に single_property を設定します。

irb(main):007> rp1.replace_relation_database database_id: owdb.id, type: "single_property"
=>
{"database_id"=>"5c0f2cc96679450c8c9498cd130e015f",
 "type"=>"single_property",
 "single_property"=>{}}
irb(main):008> db.save
=> NotionRubyMapping::Database-cad035c49e5346e78331cb5d05cbc754

One way なので以下のように片方向だけのリレーションになっていることが確認できました。

One way

RelationProperty (Two way relation)

同様に双方向のリレーションを設定してみます。type を省略すると Two way になります。

irb(main):009> rp2 = db.add_property RelationProperty, "Two Way Relation"
=>
#<NotionRubyMapping::RelationProperty:0x00000001049f4390
irb(main):010> rp2.replace_relation_database database_id: twdb.id
=>
{"database_id"=>"f80ec5b49dee4223a65c3837a35f2f97",
 "type"=>"dual_property",
 "dual_property"=>{}}
irb(main):011> db.save
=> NotionRubyMapping::Database-cad035c49e5346e78331cb5d05cbc754

正しくリレーションが設定されていることがわかります。two-way 側のプロパティ名は自動的に設定されます。

Two way

実際に保存した後の rp2 を確認してみると以下のようになっています。実際に dual_property の中の synced_property_name にその自動生成されたプロパティ名が入っています。この名前を変更した時に、two way 側のデータベースのプロパティ名が変更されるのかどうかは不明です。多分ダメだったような気がしていますが、今度試してみます。

irb(main):012> rp2
=>
#<NotionRubyMapping::RelationProperty:0x00000001049f4390
 @base_type=:database,
 @create=false,
 @json=
  {"database_id"=>"f80ec5b4-9dee-4223-a65c-3837a35f2f97",
   "type"=>"dual_property",
   "dual_property"=>
    {"synced_property_name"=>"Related to parent (Two Way Relation)",
     "synced_property_id"=>"wP%3CH"}},
 @name="Two Way Relation",
 @new_name=nil,
 @property_cache=PropertyCache,
 @property_id=nil,
 @query=nil,
 @remove=nil,
 @will_update=false>

おわりに

今回は、うまく RelationProperty を生成しました。片方向の場合と双方向の場合で設定方法が異なりますので注意してください。

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

RelationProperty

NotionRubyMapping解説