Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Active Recordについてわかったことを説明するよ
Search
bayashi
December 23, 2022
Programming
0
490
Active Recordについてわかったことを説明するよ
一年前くらいに社内勉強会で発表した資料です。
公開しても問題なさそうなんで公開
bayashi
December 23, 2022
Tweet
Share
More Decks by bayashi
See All by bayashi
複雑さを受け入れるか、拒むか? - 事業成長とともに育ったモノリスを前に私が考えたこと #RSGT2026
murabayashi
1
3k
エンジニアに事業やプロダクトを理解してもらうためにやってること
murabayashi
0
350
自分がLinc’wellで提供しているプロダクトを理解するためにやったこと
murabayashi
1
470
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
540
個人事業主型開発からの脱却
murabayashi
14
10k
スクラムフェスを支える配信の仕組み
murabayashi
1
1.1k
締切とはなにか、どういう効果があるのか #scrummikawa
murabayashi
0
1.5k
商用アプリケーション開発基本のキ
murabayashi
0
310
(新米)エンジニアリングマネージャーのしごと #RSGT2023
murabayashi
11
11k
Other Decks in Programming
See All in Programming
CSC307 Lecture 14
javiergs
PRO
0
440
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
7
1.2k
AI時代のソフトウェア開発でも「人が仕様を書く」から始めよう-医療IT現場での実践とこれから
koukimiura
0
100
Go 1.26でのsliceのメモリアロケーション最適化 / Go 1.26 リリースパーティ #go126party
mazrean
1
300
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
0
200
Python’s True Superpower
hynek
0
190
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
13
7.3k
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
210
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
710
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
400
RubyとGoでゼロから作る証券システム: 高信頼性が求められるシステムのコードの外側にある設計と運用のリアル
free_world21
0
110
Railsの気持ちを考えながらコントローラとビューを整頓する/tidying-rails-controllers-and-views-as-rails-think
moro
4
350
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
250
Navigating Weather and Climate Data
rabernat
0
130
Are puppies a ranking factor?
jonoalderson
1
3k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
82
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Faster Mobile Websites
deanohume
310
31k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
220
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Transcript
家政婦は見た! 命を張った好奇心 Active Recordの正体と 犠牲にされた疎結合 命を張った好奇心 Active Recordの正体と 犠牲にされた疎結合
最近 設計の本とかパーフェクト ruby on railsとか読んでActive Recordが何なのかちょっとだ け理解できてきたので語っていきます。
Rails ガイドのActive Recordとは 1 Active Recordについて Active Recordとは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です。Active Recordは、データベースに恒久的に保存される必要のあるビジネスオブジェクトの作成と利用を円滑に行なえるようにします。Active Recordは、ORM
(オブジェクト/リレーショナルマッピング)システムに記述されている「Active Recordパターン」を実装したものであり、このパターンと同じ名前が付けら れています。 1.1 Active Recordパターン パターン名としてのActive RecordはMartin Fowler『Patterns of Enterprise Application Architecture』という書籍に記述されています。Active Record パターンにおいて、オブジェクトとは永続的なデータであり、そのデータに対する振る舞いでもあります。Active Recordパターンは、データアクセスのロ ジックを常にオブジェクトに含めておくことで、そのオブジェクトの利用者にデータベースへの読み書き方法を指示できる、という立場に立っています。 https://railsguides.jp/active_record_basics.html#active-record%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
PoEAA https://www.amazon.co.jp/dp/B01B5MX2O2/
PoEAAのActive Recordとは データベースのテーブルやビューの列をラップし、データベースアクセスをカプセル化し、ドメインロジックを追加するオブジェクト データと振る舞いの両方を持つオブジェクト。データの多くは永続的であり、データベースに格納される必要がある。 ActiveRecordは、メイン オブジェクトにデータアクセス処理を置くという最も明らかなアプローチを採用している。この方法では、全員がデータベースへの読み書きす るやり方を知っている。 https://bliki-ja.github.io/pofeaa/ActiveRecord/
Active Recordとは 1. データベースのテーブルやビューの列をラップし、 a. 1テーブル、1クラス。クラスの属性は、テーブルの各カラムに対応 2. データベースアクセスをカプセル化し、 a.
ORM 3. ドメインロジックを追加するオブジェクト a. ドメインロジック?なんだそれ
ドメインとは ドメインは「領域」の意味をもった言葉です。ソフト ウェア開発におけるドメインは、「プログラムを適用 する対象となる領域」を指します。重要なのはドメイ ンが何かではなく、ドメインに含まれるものが何か です。 成瀬 允宣. ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
ドメインとは たとえば会計システムを例にしてみましょう。会計 の世界には金銭や帳票といった概念が登場しま す。これらは会計システムのドメインに含まれま す。物流システムであればどうでしょうか。会計シ ステムとは打って変わって貨物や倉庫、輸送手段 などの概念が存在し、それらがそのまま物流シス テムのドメインに含まれます。
成瀬 允宣. ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
モデルとは 「モデルとは、何らかの実体があって、それ を縮小(あるいは拡大)して細かい部分は 省いて自分たちの都合の良いところだけを 抽出して形成した形のことである。」(知り合 いのモデラー談)
モデルとは 同じ人間だけど、「スポーツをする人」と捉 えたときと「転職をする人」と捉えたときで 抽出する情報は変わってくる。 自分たちがシステム化したいドメインに関 して対象をモデル化したものを ドメインモデ ルと呼ぶ。
Active Recordをドメインモデルと呼んでる 人はあんまりいないけど広義にはActive Recordもドメインモデルになると思う。
RailsのActive Recordを継承したmodel - 値のチェック - ユースケースの組み立て RailsにおけるActive Recordがやってくれること
値のチェック →validation ユースケースの組み立て →after_createとか Active Record パターン - DBをラップ - ORM - ドメインロジック
僕がやったことのあるSpring(Javaのフレームワーク) 値のチェック → form object ユースケースの組み立て → service ORM →
repository DBをラップ → なかった気がする ドメインロジック → Entity 確かこんな感じだった気がする...
RailsのActive Record - 値のチェック - ユースケースの組み立て RailsにおけるActive Recordがやってくれること
値のチェック →validation ユースケースの組み立て →after_createとか Active Record パターン - DBをラップ - ORM - ドメインロジック
RailsのActive Record - 値のチェック - ユースケースの組み立て RailsにおけるActive Recordがやってくれること
値のチェック →validation ユースケースの組み立て →after_createとか Active Record パターン - DBをラップ - ORM - ドメインロジック そりゃあFat Modelになりまっせ!
Rails の Active Recordは めっちゃ色んな機能を集約したおかげで便利につかえる あとModelとTableを1:1対応にしたことで何も宣言せずに便利に使える https://speakerdeck.com/yasaichi/what-is-ruby-on-rails-and-how-to-deal-with-it?slide=39
じゃあFat Modelどうするんだ 値object →紹介 ドメインモデルへの切り出し https://qiita.com/MinoDriven/items/3c7db287e2c66f36589a サービスクラスhttps://qiita.com/chrischris0801/items/58a12d17a440b842db02
値オブジェクト パラメータ名 パラメータの型 名前 String 誕生日 date 住所 String 性別
String 人物モデル 各パラメータの制限や便利メソッドはすべ て人物モデルの中にある 制限の例: 誕生日は過去日でないといけな い 便利メソッド: 誕生日から今の年齢を出す
値オブジェクト パラメータ名 パラメータの型 名前 String 誕生日 Birthday 住所 String 性別
String 人物モデル 制限の例: 誕生日は過去日でないといけな い 便利メソッド: 誕生日から今の年齢を出す ↓ Birthdayクラスを作りそこに集約する
こういうのやっていくとRails wayから離れる = 規約のパワーでどうにかできなくなりRailsである必要 ある?状態になる
ちょっとまって本当にまだRails Wayから去る必要ある? tableとmodelが1:1だとして データモデリングちゃんとできてる?
https://www.slideshare.net/HidekatsuIzuno/ss-67532977
人物マージの例 例えば人物マージという機能がある - データ上のAさんとBさんが実際は同一人物(重複登録)だったためマージする機能 人物マージはそもそも人物というモデルの責務なのか? マージされる側の責務?マージする側の責務? controllerは何のメソッド使う?update?delete? merge可能かどうかはどう判定する?
過去自分がやった実装 マージされる側の責務?マージする側の責務? →マージする側(残る側)の責務にしよう...うーん controllerは何のメソッド使う?update?delete? →よくわかんないけどupdateかな... merge可能かどうかはどう判定する? →merge_candidateメソッドの中でチェックしよう...
今の自分がやるなら 人物マージをイベントとして捉えてそれをモデルにする (イベントが発生したらDBにも保存する) マージされる側の責務?マージする側の責務? →人物の責務じゃなくて人物マージの責務
controllerは何のメソッド使う?update?delete? →人物マージのレコードがひとつ増えるからcreate merge可能かどうかはどう判定する? →validateで判定可能 after_createでマージされる側を削除するロジックを組み立てる
参考文献 パーフェクト Ruby on Rails 【増補改訂版】 現場で役立つシステム設計の原則 ドメイン駆動設計入門 https://anchor.fm/textafm