Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Active Recordについてわかったことを説明するよ

bayashi
December 23, 2022

Active Recordについてわかったことを説明するよ

一年前くらいに社内勉強会で発表した資料です。
公開しても問題なさそうなんで公開

bayashi

December 23, 2022
Tweet

More Decks by bayashi

Other Decks in Programming

Transcript

  1. 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
  2. RailsのActive Recordを継承したmodel 
 - 値のチェック
 - ユースケースの組み立て 
 RailsにおけるActive Recordがやってくれること


    値のチェック
 →validation
 ユースケースの組み立て
 →after_createとか
 
 
 Active Record パターン 
 - DBをラップ
 - ORM
 - ドメインロジック
 

  3. 僕がやったことのあるSpring(Javaのフレームワーク)
 値のチェック → form object
 ユースケースの組み立て → service
 ORM →

    repository
 DBをラップ → なかった気がする
 ドメインロジック → Entity
 確かこんな感じだった気がする...

  4. RailsのActive Record 
 - 値のチェック
 - ユースケースの組み立て 
 RailsにおけるActive Recordがやってくれること


    値のチェック
 →validation
 ユースケースの組み立て
 →after_createとか
 
 
 Active Record パターン 
 - DBをラップ
 - ORM
 - ドメインロジック
 

  5. RailsのActive Record 
 - 値のチェック
 - ユースケースの組み立て 
 RailsにおけるActive Recordがやってくれること


    値のチェック
 →validation
 ユースケースの組み立て
 →after_createとか
 
 
 Active Record パターン 
 - DBをラップ
 - ORM
 - ドメインロジック
 
 そりゃあFat Modelになりまっせ!

  6. 値オブジェクト
 パラメータ名 パラメータの型 名前 String 誕生日 date 住所 String 性別

    String 人物モデル
 各パラメータの制限や便利メソッドはすべ て人物モデルの中にある 制限の例: 誕生日は過去日でないといけな い 便利メソッド: 誕生日から今の年齢を出す
  7. 値オブジェクト
 パラメータ名 パラメータの型 名前 String 誕生日 Birthday 住所 String 性別

    String 人物モデル
 制限の例: 誕生日は過去日でないといけな い 便利メソッド: 誕生日から今の年齢を出す ↓ Birthdayクラスを作りそこに集約する
  8. 今の自分がやるなら
 人物マージをイベントとして捉えてそれをモデルにする 
 (イベントが発生したらDBにも保存する) 
 
 マージされる側の責務?マージする側の責務? 
 →人物の責務じゃなくて人物マージの責務 


    controllerは何のメソッド使う?update?delete? 
 →人物マージのレコードがひとつ増えるからcreate 
 merge可能かどうかはどう判定する? 
 →validateで判定可能
 
 after_createでマージされる側を削除するロジックを組み立てる