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

滅・サービスクラス🔥 / Destruction Service Class

滅・サービスクラス🔥 / Destruction Service Class

【オフライン開催】Roppongi.rb #27
https://roppongirb.connpass.com/event/343872/

Takumi Shotoku

February 13, 2025
Tweet

More Decks by Takumi Shotoku

Other Decks in Technology

Transcript

  1. ࣗݾ঺հ • ໊લ: ਖ਼ಙ ޼(aka: ਆ଎) • GitHub: @sinsoku (ը૾ӈ্)

    • X: @sinsoku_listy (ը૾ӈԼ) • Railsྺ: 10೥͘Β͍ 2
  2. ⭐ ผख๏: ActiveRecord::Callbacks Λ࢖͏ • 1ͭͷτϥϯβΫγϣϯʹͳΔ • before_validation ͔ΒτϥϯβΫγϣϯʹؚ·ΕΔ2 •

    ϞσϧʹϩδοΫ͕ू໿͞ΕΔ • Immutable Data Model લఏͰઃܭ͢Δ 2 SQLΛൃߦ͠ͳ͍৔߹͸τϥϯβΫγϣϯͷ։࢝͸஗Ԇ͞ΕΔ 12
  3. NG: UserArchiveServiceΛ࡞Δ class UsersController # POST /users/:id/archive def archive service

    = UserArchiveService.new(current_user) if service.call head :ok else head :bad_request end end end 14
  4. NG: UserArchiveServiceΛ࡞Δ class UserArchiveService validate :unpaid_fees_must_not_exist def initialize(user) @user =

    user end def call ActiveRecord:"Base.transaction do # `users.deleted_at` ʹݱࡏ೔࣌Λอଘ # ؔ࿈͢ΔσʔλΛߋ৽͢Δ end end end 15
  5. OK: ArchiveϞσϧΛ࡞Δ class Archive < ApplicationRecord belongs_to :user validate :unpaid_fees_must_not_exist

    after_create :set_deleted_at, :update_related_data private def set_deleted_at user.update!(archived_at: Time.current) end def update_related_data # ؔ࿈͢ΔσʔλΛߋ৽͢Δ end end 17
  6. ! ·ͱΊʢ͕࣌ؒ଍Γͳ͔ͬͨ...ʣ • CallbacksΛ࢖͏ͷ΋ѱ͘ͳ͍ • accepts_nested_attributes_for ͷར༻΋ѱ͘ͳ͍ • ͨͩ͠ Immutable

    Data Model Λҙࣝ͢Δ • 1ͭͷϞσϧʹ Callbacks ͕ଟ͘ͳΓෳࡶʹͳΔͨΊ ଓ͖͸࠙਌ձͰ࿩͠·͠ΐ͏ !" 19