Slide 1

Slide 1 text

Rubyで階層構造

Slide 2

Slide 2 text

自己紹介 ● Twitter @ryonext ● 新横浜の某所から来ました

Slide 3

Slide 3 text

話の内容 ● Rubyで階層構造を実現するancestryという gemの話をします

Slide 4

Slide 4 text

発端 ● デブサミ行きました ● t-wadaさんの”SQLアンチパターン”聞きま した ● ナイーブツリーの話

Slide 5

Slide 5 text

親IDだけもつような構造、良くな い ● Comments ● id ● parent_id ● comment ● のような設計 ● => 深さがどれぐらいになるかわからない し、再起処理でDQNクエリが走る

Slide 6

Slide 6 text

解決策として ● 経路列挙、というのが上げられていた id path comment 1 1/ aaa 2 1/2/ bbb 3 1/2/3/ ccc 4 1/4 ddd

Slide 7

Slide 7 text

このgem入れれば実装してくれる ● https://github.com/stefankroes/ancestry

Slide 8

Slide 8 text

使い方通りに以下の様なデータを ● rails g model group name ● Create migration: rails g migration add_ancestry_to_group ancestry:string ● Add index to migration: add_index gruop, :ancestry (UP) / remove_index gruop, :ancestry (DOWN) ● Migrate your database: rake db:migrate ● Add to app/models/gruop.rb: has_ancestry

Slide 9

Slide 9 text

こんなデータ作ってみた ● 宇宙 ● 銀河系 – 太陽系 ● 水 ● 金 ● 地 – 日本 ● 関東 ● 東京 ● 渋谷 ● 浅草 ● グンマー – アメリカ – イギリス ● 火 ● 木 ● 土 ● 天 ● 海 ● その他 – 冥ちゃん・・・(´;ω;`)

Slide 10

Slide 10 text

ここで子孫全部取る処理 ● 宇宙 < 僕の子孫あつまれー(^o^)ノ ● 銀河系 – 太陽系 ● 水 ● 金 ● 地 – 日本 ● 関東 ● 東京 ● 渋谷 ● 浅草 ● グンマー – アメリカ – イギリス ● 火 ● 木 ● 土 ● 天 ● 海 ● その他 – 冥ちゃん・・・(´;ω;`)

Slide 11

Slide 11 text

クエリが一個しか発行されない ● Group.find_by_name("宇宙").descendants ● Group Load (0.4ms) SELECT "groups".* FROM "groups" WHERE (groups.ancestry like '1/%' or groups.ancestry = '1') ● => どの階層でやっても応答速度が同一

Slide 12

Slide 12 text

Rubyで階層構造 ● 階層構造実現したければこれ使えばいいん じゃないでしょうか。 ● ファイル/ディレクトリ ● 組織階層 ● ディスカッションツリー

Slide 13

Slide 13 text

でも・・・ ● 親がよく変わるケース(ディレクトリと か)だと親が変わると鬼update文走るよ ね、ってことを思った。