[{"data":1,"prerenderedAt":328},["ShallowReactive",2],{"recruit-jobs":3,"recruit-articles-all-1":157,"recruit-articles-categories":265,"recruit-article-entry-260":277},{"list":4,"categories":146},[5,13,18,23,28,33,41,46,51,56,61,66,71,76,81,86,91,96,101,106,111,116,121,126,131,136,141],{"topics_id":6,"contents_type":7,"contents_type_nm":8,"name":9,"text":10,"url":11,"is_top":12},64,18,"新卒","WEBエンジニア職","事業・サービス・社内業務効率化に関わるプロダクト開発、システム開発、アプリ開発などDX推進を担当。","https://public.n-ats.hrmos.co/rizapgroup/jobs/2126894917723471872",true,{"topics_id":14,"contents_type":7,"contents_type_nm":8,"name":15,"text":16,"url":17,"is_top":12},65,"データサイエンティスト職","事業・サービスに関わるビッグデータに対して、横断的にデータ分析基盤を構築し、新しい提供価値を創造。","https://public.n-ats.hrmos.co/rizapgroup/jobs/2171814626636591104",{"topics_id":19,"contents_type":7,"contents_type_nm":8,"name":20,"text":21,"url":22,"is_top":12},66,"業務自動化エンジニア職","様々な業態・業務プロセスにおける、自動化や仕組み化の導入・開発を推進。","https://public.n-ats.hrmos.co/rizapgroup/jobs/2126896559415881728",{"topics_id":24,"contents_type":7,"contents_type_nm":8,"name":25,"text":26,"url":27,"is_top":12},67,"IoTエンジニア職","IoT事業の拡大に向け、ハード・ソフト両軸で新しい体験価値を創造。","https://public.n-ats.hrmos.co/rizapgroup/jobs/2156228450968444928",{"topics_id":29,"contents_type":7,"contents_type_nm":8,"name":30,"text":31,"url":32,"is_top":12},68,"セキュリティエンジニア職","従業員の働きやすさを支える、業務システムとITインフラの構築・管理。","https://public.n-ats.hrmos.co/rizapgroup/jobs/2179029856766332928",{"topics_id":34,"contents_type":35,"contents_type_nm":36,"name":37,"text":38,"url":39,"is_top":40},69,21,"中途","開発PM","Webサービスやモバイルアプリの要件定義・設計から開発チームのマネジメント、進捗・品質管理、定量定性分析による改善を担う。","https://hrmos.co/pages/rizapgroup/jobs/000003",false,{"topics_id":42,"contents_type":35,"contents_type_nm":36,"name":43,"text":44,"url":45,"is_top":40},70,"Webディレクター","WebページのディレクションからCMS運用、KPI設計・ABテスト・PDCAサイクルによるサイトグロースまで、幅広くWeb制作の進行を担う。","https://hrmos.co/pages/rizapgroup/jobs/000007",{"topics_id":47,"contents_type":35,"contents_type_nm":36,"name":48,"text":49,"url":50,"is_top":12},71,"シニアプロダクトマネージャー","アプリ・店舗IoT・タブレット等の複数プロダクト戦略策定から要件定義・UX設計・効果検証まで、経営層と連携しながら一貫してプロダクト開発を主導。","https://hrmos.co/pages/rizapgroup/jobs/000010",{"topics_id":52,"contents_type":35,"contents_type_nm":36,"name":53,"text":54,"url":55,"is_top":12},72,"IoTサーバーエンジニア(オープンポジション)","店舗デバイスのデータ収集・遠隔制御基盤からアルゴリズム、外部ベンダー管理まで幅広く担当。既存システム連携や新価値提案を通じ、デバイス活用の仕組み作りを担う。","https://hrmos.co/pages/rizapgroup/jobs/000015",{"topics_id":57,"contents_type":35,"contents_type_nm":36,"name":58,"text":59,"url":60,"is_top":40},73,"店舗IoT／ハードウェア企画・プロダクトマネージャー","グループ独自のサービスやシステムの企画、要件定義、開発管理を担う。PoCによる仮説検証を行うほか、外部ベンダー管理を含むプロジェクト全体の推進を行う。","https://hrmos.co/pages/rizapgroup/jobs/000019",{"topics_id":62,"contents_type":35,"contents_type_nm":36,"name":63,"text":64,"url":65,"is_top":40},74,"モバイルアプリエンジニア(Android)","Kotlinを用いたAndroidアプリの企画・設計・開発・運用を担当。PdM・デザイナー・バックエンドエンジニアと連携したチーム開発でサービス品質向上を推進する。","https://hrmos.co/pages/rizapgroup/jobs/000025",{"topics_id":67,"contents_type":35,"contents_type_nm":36,"name":68,"text":69,"url":70,"is_top":40},75,"データアナリスト","SQLや機械学習を活用し、サービスの新規開発・改善を支援する。KPI定義・可視化・データ分析基盤の構築を担当。","https://hrmos.co/pages/rizapgroup/jobs/000042",{"topics_id":72,"contents_type":35,"contents_type_nm":36,"name":73,"text":74,"url":75,"is_top":40},76,"Webデザイナー","WebサービスやアプリのUI/UXからLP・バナー等の広告クリエイティブ制作など、デジタル+リアルの顧客接点を意識したデザイン業務を担う。","https://hrmos.co/pages/rizapgroup/jobs/000061",{"topics_id":77,"contents_type":35,"contents_type_nm":36,"name":78,"text":79,"url":80,"is_top":40},77,"プロジェクトマネージャー・プロジェクトリーダー","RIZAPグループ全社のDX推進として、清掃管理システムやCTI/CRMリプレイス等のシステム導入プロジェクトを要件定義からリリースまで一貫してマネジメントする。","https://hrmos.co/pages/rizapgroup/jobs/100008",{"topics_id":82,"contents_type":35,"contents_type_nm":36,"name":83,"text":84,"url":85,"is_top":40},78,"Webディレクター（マネージャー候補）","WebディレクションやサイトグロースのPDCA推進に加え、ディレクター育成・目標設定・評価・アーキテクチャ選定など組織マネジメント全般を担うリーダー職。","https://hrmos.co/pages/rizapgroup/jobs/1971790520045400071",{"topics_id":87,"contents_type":35,"contents_type_nm":36,"name":88,"text":89,"url":90,"is_top":40},79,"開発PM（マネージャー候補）","Webサービス・モバイルアプリの開発方針策定からPMチームの育成・評価・組織運営まで担い、経営層・外部パートナーと連携しながらプロダクト開発を統括する。","https://hrmos.co/pages/rizapgroup/jobs/1971790520045400072",{"topics_id":92,"contents_type":35,"contents_type_nm":36,"name":93,"text":94,"url":95,"is_top":40},80,"DX戦略推進マネージャー","経営・事業戦略フェーズから参画し、AI/RPA活用を前提とした業務プロセス改革・システム要件定義・開発ディレクション・ステークホルダー調整を横断的に主導。","https://hrmos.co/pages/rizapgroup/jobs/1971790520045400083",{"topics_id":97,"contents_type":35,"contents_type_nm":36,"name":98,"text":99,"url":100,"is_top":40},81,"PL／PM","システム構築プロジェクトにおいて、進捗・課題・コスト管理から外部ベンダー交渉・社内調整まで幅広くプロジェクトのマネジメントを担う。","https://hrmos.co/pages/rizapgroup/jobs/1971790520045400102",{"topics_id":102,"contents_type":35,"contents_type_nm":36,"name":103,"text":104,"url":105,"is_top":40},82,"社内SE／インフラ・ネットワークアーキテクト","社内インフラ・ネットワークの要件定義・設計・リリースから基幹システムのリプレイス検討・保守運用改善まで、グループ全体の社内ITを包括的に担当。","https://hrmos.co/pages/rizapgroup/jobs/1971790520045400103",{"topics_id":107,"contents_type":35,"contents_type_nm":36,"name":108,"text":109,"url":110,"is_top":40},83,"電気エンジニア(オープンポジション)","店舗設置IoT機器の回路・基板設計・試作・評価・検証を行い、パートナーとの生産立ち上げや外部開発ベンダーのマネジメントまで手掛けるハードウェア開発職。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341962",{"topics_id":112,"contents_type":35,"contents_type_nm":36,"name":113,"text":114,"url":115,"is_top":40},84,"業務アプリケーション開発エンジニア・アーキテクト","クラウドを活用したRIZAPグループ各社の社内業務アプリを内製開発・運用し、現場ヒアリングから要件定義・自動化・効率化の実装まで一貫して担う。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341966",{"topics_id":117,"contents_type":35,"contents_type_nm":36,"name":118,"text":119,"url":120,"is_top":40},85,"組み込みエンジニア(オープンポジション)","センサーや無線通信を用いたIoT機器のファームウェア設計・実装・検証とセンサーデータ分析・制御アルゴリズム開発を担い、外部ベンダー共同開発も管理する。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341969",{"topics_id":122,"contents_type":35,"contents_type_nm":36,"name":123,"text":124,"url":125,"is_top":40},86,"機構エンジニア(オープンポジション)","店舗設置機器の機構部PoC・設計・試作・評価から樹脂成型・板金部品の量産化まで担い、生産パートナーと協力して製造立ち上げを主導するエンジニア職。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341970",{"topics_id":127,"contents_type":35,"contents_type_nm":36,"name":128,"text":129,"url":130,"is_top":40},87,"ハードウェア品質管理","既存マシンの品質課題解析や対策立案から、新デバイスの性能・信頼性評価、品質データ分析・工程管理まで一貫して担い、ハードウェアの品質保証と改善提案をリードする。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341973",{"topics_id":132,"contents_type":35,"contents_type_nm":36,"name":133,"text":134,"url":135,"is_top":40},88,"AI・データユニット（20代の第二新卒～ミドルクラス）","多角的な事業から得られる膨大なデータを活用し、ビジネスインパクトを最大化するためのデータ基盤構築およびAIソリューションの開発を担う。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341987",{"topics_id":137,"contents_type":35,"contents_type_nm":36,"name":138,"text":139,"url":140,"is_top":40},89,"修理工程プロセスエンジニア・現場監督","新規修理工程の立ち上げ・レイアウト設計・設備選定からSOP作成・進捗/品質/コスト管理・現場作業員の安全衛生監督まで一貫して担う製造現場リーダー職。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341990",{"topics_id":142,"contents_type":35,"contents_type_nm":36,"name":143,"text":144,"url":145,"is_top":40},90,"修理現場リーダー・作業員監督","新規修理工程にて、現場の労務・シフト管理や技術指導、進捗管理を一貫して担当。現場の課題を吸い上げ、プロセス改善や品質向上に向けた提案までを担う。","https://hrmos.co/pages/rizapgroup/jobs/2110665929241341991",[147,151,154],{"label":148,"value":149,"to":150},"すべて","all","/recruit/jobs",{"label":8,"value":152,"to":153},"18","/recruit/jobs/categories/18",{"label":36,"value":155,"to":156},"21","/recruit/jobs/categories/21",{"articles":158,"totalPageCnt":264},[159,170,180,187,197,202,210,216,222,228,233,238,243,253,258],{"to":160,"image":161,"date":162,"label":163,"title":164,"tags":165},"/recruit/articles/entries/199","https://rizap-tech.g.kuroco-img.app/v=1775010931/files/user/recruit/contents/thumbnail/n5cfaf3e31c72_73e97bd445fe0dfcbf6bbcdef8acc1f4.png","2026.02.05","技術・カンファレンス","AIエージェント時代を見据えた認証認可の未来 ─ Authlete Meetup 2025 参加レポート",[166,167,168,169],"イベントレポート","カンファレンス","Authlete","エンジニア",{"to":171,"image":172,"date":173,"label":174,"title":175,"tags":176},"/recruit/articles/entries/200","https://rizap-tech.g.kuroco-img.app/v=1775010935/files/user/recruit/contents/thumbnail/n9a33f80f8704_7728e1500e7c81f2e18fbd5accede9a9.jpeg","2026.01.19","インターン・採用","【RIZAPテクノロジーズ】27年卒向け　第9回3Daysエンジニアインターンを開催しました！",[169,177,178,179],"開発","新卒採用","インターン",{"to":181,"image":182,"date":183,"label":163,"title":184,"tags":185},"/recruit/articles/entries/201","https://rizap-tech.g.kuroco-img.app/v=1775010937/files/user/recruit/contents/thumbnail/n24f5b9c49390_6873514f9cb987e31f21d908e7882fc4.png","2026.01.08","RIZAPオフィスでProgateハッカソンを開催しました！",[178,186],"ハッカソン",{"to":188,"image":189,"date":190,"label":191,"title":192,"tags":193},"/recruit/articles/entries/203","https://rizap-tech.g.kuroco-img.app/v=1775010930/files/user/recruit/contents/thumbnail/n2f795844f152_90197213ae57cefa5c5b5bbfb90cc914.png","2025.12.26","インタビュー","内定者が聞く、RIZAPテクノロジーズ IoT統括部のリアル【後編】",[194,195,196],"社員インタビュー","IoT","仕事のリアル",{"to":198,"image":199,"date":190,"label":191,"title":200,"tags":201},"/recruit/articles/entries/202","https://rizap-tech.g.kuroco-img.app/v=1775010933/files/user/recruit/contents/thumbnail/n8a11235fd931_b14a9ca709c1ead3e54b9d46c46b3d4f.png","内定者が聞く、RIZAPテクノロジーズ IoT統括部のリアル【前編】",[194,195,196],{"to":203,"image":204,"date":205,"label":163,"title":206,"tags":207},"/recruit/articles/entries/204","https://rizap-tech.g.kuroco-img.app/v=1775010959/files/user/recruit/contents/thumbnail/ne6d110c0bec0_9577421efba8a564c17a6f9862c51c48.jpeg","2025.12.23","YAPC::Fukuoka 2025カンファレンスレポート【各講演の学び】",[166,167,169,208,209],"SRE","YAPC",{"to":211,"image":212,"date":213,"label":174,"title":214,"tags":215},"/recruit/articles/entries/205","https://rizap-tech.g.kuroco-img.app/v=1775010934/files/user/recruit/contents/thumbnail/n8ba7168ba394_0aa90eced3923259150a7e78b770d871.jpeg","2025.12.19","【RIZAPテクノロジーズ】27年卒向け　第8回3Daysエンジニアインターンを開催しました！",[169,177,178,179],{"to":217,"image":218,"date":219,"label":163,"title":220,"tags":221},"/recruit/articles/entries/206","https://rizap-tech.g.kuroco-img.app/v=1775010948/files/user/recruit/contents/thumbnail/n1843939c3a3c_8f61cafb8ad4218a615ec0751333945e.jpeg","2025.12.11","58ハッカソンにメンターとして参加しました！",[169,186,166],{"to":223,"image":224,"date":225,"label":191,"title":226,"tags":227},"/recruit/articles/entries/210","https://rizap-tech.g.kuroco-img.app/v=1775010930/files/user/recruit/contents/thumbnail/n3d479ba02fcc_c19c70a9c2415f376a3d6b83fce5a8b3.png","2025.12.04","未経験からバックエンドエンジニアに！　若手社員が語る、個人のスキルだけではいけない理由",[194,178,169,177],{"to":229,"image":230,"date":225,"label":191,"title":231,"tags":232},"/recruit/articles/entries/209","https://rizap-tech.g.kuroco-img.app/v=1775010952/files/user/recruit/contents/thumbnail/nb1b9e76e120b_df4b3f13b243d61bc3d303a0491524b7.png","エンジニアの力で社内の業務を自動化！　“to 社内向け”の仕事とは？",[194,169,178,196],{"to":234,"image":235,"date":225,"label":191,"title":236,"tags":237},"/recruit/articles/entries/208","https://rizap-tech.g.kuroco-img.app/v=1775010949/files/user/recruit/contents/thumbnail/n310208834a85_5857b502c7e40d1ce19340d831671b68.png","データアナリストとして成長途中のRIZAPを支える！　データを使った影響力のあるしごと",[194,178,196],{"to":239,"image":240,"date":225,"label":191,"title":241,"tags":242},"/recruit/articles/entries/207","https://rizap-tech.g.kuroco-img.app/v=1775010943/files/user/recruit/contents/thumbnail/n588feaae4af0_2ebd47200eaaa8ae0324c4b5d50428fe.png","デジタル化に留まらないDXを。 “攻め” の情報システム部とは？【内定者が若手社員に聞く！】",[194,178,196],{"to":244,"image":245,"date":246,"label":163,"title":247,"tags":248},"/recruit/articles/entries/213","https://rizap-tech.g.kuroco-img.app/v=1775010957/files/user/recruit/contents/thumbnail/ndbe0ad4c3c3b_881fecd27c29077dd8e3601cce3d06fc.jpeg","2025.12.03","Vue Fes Japan 2025 に登壇しました！",[166,167,249,250,251,169,252],"vue","nuxt","chocoZAP","登壇",{"to":254,"image":255,"date":246,"label":163,"title":256,"tags":257},"/recruit/articles/entries/212","https://rizap-tech.g.kuroco-img.app/v=1775010954/files/user/recruit/contents/thumbnail/nc0b63b0ba413_80f5027c4e0c8dc5adcdb46227fef03d.jpeg","Vue Fes Japan 2025  参加レポート",[166,167,249,250,169],{"to":259,"image":260,"date":246,"label":163,"title":261,"tags":262},"/recruit/articles/entries/211","https://rizap-tech.g.kuroco-img.app/v=1775010932/files/user/recruit/contents/thumbnail/n05f3262fccc7_bbdfb906499373c3a143a2b88638f2dd.jpeg","chocoZAPがRuby biz Grand prix 2025 大賞を受賞",[166,263,169,251,252],"Ruby",10,[266,268,271,274],{"label":148,"value":149,"to":267},"/recruit/articles",{"label":163,"value":269,"to":270},"32","/recruit/articles/categories/32",{"label":174,"value":272,"to":273},"33","/recruit/articles/categories/33",{"label":191,"value":275,"to":276},"31","/recruit/articles/categories/31",{"article":278,"relatedJobs":288,"relatedArticles":291},{"date":279,"publishedAt":280,"categoryName":163,"title":281,"heroImage":282,"body":283,"metaDescription":284,"tags":285},"2024.11.14","2024-11-14T00:00:00+09:00","Kaigi on Rails 2024カンファレンスレポート【各講演の学び】","https://rizap-tech.g.kuroco-img.app/v=1775010937/files/user/recruit/contents/thumbnail/n21e0268fa3b2_9a8e9ed4a94d6e0ceaaba5f00c567617.jpeg","\u003Cfigure name=\"9b80006c-8592-4f38-bfe2-3726e09a909e\" id=\"9b80006c-8592-4f38-bfe2-3726e09a909e\">\u003Cblockquote>\u003Cp name=\"e4f39a63-9977-4f35-aa5d-f4fe18f17b8c\" id=\"e4f39a63-9977-4f35-aa5d-f4fe18f17b8c\">10/25~26に開催された「Kaigi on Rails 2024」にRIZAPメンバーが参加。ここでは、会期中に開催された数々の講演について、バックエンドエンジニアのメンバーが、それぞれの言葉で感想をまとめています。\u003C/p>\u003C/blockquote>\u003Cfigcaption>\u003C/figcaption>\u003C/figure>\u003Cp name=\"10e99bd5-1601-4eeb-a209-7e4fb087daff\" id=\"10e99bd5-1601-4eeb-a209-7e4fb087daff\">（※以下、Web上で公開されている登壇資料を適宜引用させていただいております）\u003C/p>\u003Ch2 name=\"9c7fedff-8bb0-4505-adbc-a6218ecf5d2e\" id=\"9c7fedff-8bb0-4505-adbc-a6218ecf5d2e\">梅田智大の感想まとめ\u003C/h2>\u003Ch3 name=\"ce6d2143-e226-42d5-80a7-06e42dfa561c\" id=\"ce6d2143-e226-42d5-80a7-06e42dfa561c\">「 \u003Ca href=\"https://kaigionrails.org/2024/talks/igaiga/\" target=\"_blank\" rel=\"nofollow noopener\">Railsの仕組みを理解してモデルを上手に育てる - モデルを見つける、モデルを分割する良いタイミング -\u003C/a> 」\u003C/h3>\u003Cp name=\"d35356b7-3a37-4fbe-bd6a-3571770560e4\">\u003Ca href=\"https://speakerdeck.com/igaiga/kaigionrails2024\" target=\"_blank\" rel=\"noopener noreferrer\">https://speakerdeck.com/igaiga/kaigionrails2024\u003C/a>\u003C/p>\u003Cp name=\"2362b2e4-ba6b-475d-9b1a-f0b23530912c\" id=\"2362b2e4-ba6b-475d-9b1a-f0b23530912c\">\u003Cstrong>【概要】\u003C/strong>\u003Cbr>登壇されたのは、RubyやRailsに関する数多くの著書を執筆している五十嵐邦明さんです。初心者向けの書籍も多く出版されており、私自身も「Ruby超入門」という一冊でRubyを初めて学びました！\u003C/p>\u003Cp name=\"d52f99af-d4bd-4ec7-bd15-3519f12dba32\" id=\"d52f99af-d4bd-4ec7-bd15-3519f12dba32\">▼著書の一覧はこちら\u003C/p>\u003Cp name=\"17586ec6-cfa1-4574-a55a-2d6b10a4d7f5\">\u003Ca href=\"https://garnettech373.com/books/\" target=\"_blank\" rel=\"noopener noreferrer\">https://garnettech373.com/books/\u003C/a>\u003C/p>\u003Cp name=\"5a188ad8-0ca9-42ab-9da4-10a4926dc3d3\" id=\"5a188ad8-0ca9-42ab-9da4-10a4926dc3d3\">今年のKaigi on Rails 2024の開幕を飾った基調講演では、Palkanさんが「Rails wayとは」を熱く語っておりましたが、それに続くように、五十嵐さんは「Rails wayに基づくモデルの適切な分割方法」についてお話しされていました。\u003C/p>\u003Cp name=\"233fdb2f-1868-49a6-af0b-4145388d2116\" id=\"233fdb2f-1868-49a6-af0b-4145388d2116\">最初に「イベント型モデル」というアプローチが紹介されました。 例えば、ユーザーが商品をお気に入りに追加するケースを考えてみましょう。 この場合、ユーザーは複数の商品をお気に入りにでき、商品も複数のユーザーにお気に入りとして登録される可能性があります。しかし、ユーザーモデルと商品モデルだけでは、お気に入りの追加処理をどこに書くべきか迷ってしまいます。 もし、ユーザーモデルに「お気に入りに追加する」というアクションを増やすと、モデルの責務が増え、Rails wayから外れてしまいます。そこで「お気に入り登録」というイベント自体をモデル化し、Favoriteモデルのような専用のモデルを用意することで、お気に入りの追加や削除をこのモデルに集約し、複数モデルにまたがる処理を整理できるとのことでした。 このように、イベント型モデルの利点として、複数モデルにまたがるビジネスロジックの置き場所が明確になる点が挙げられていました。\u003C/p>\u003Cp name=\"bf3d3195-4c72-45aa-a468-5c5f7d2f6f64\" id=\"bf3d3195-4c72-45aa-a468-5c5f7d2f6f64\">次に「PORO（Plain Old Ruby Object）」についても解説がありました。これは、ActiveRecordを継承せず、データベースに保存しないクラスのことを指します。 テーブルに結びつかない「モデルらしいオブジェクト」が必要になった場合にPOROを作成することで、適切な処理の置き場を作ることができ、チームメンバーも一貫した実装がしやすくなると話されていました。 また、先ほどのイベント型モデルも、イベントを保存するテーブルが存在しない場合にはPOROを活用できるとのことです。 ただし、Rails wayを保つために、クラス名は返すオブジェクトに即した名詞を使用するなど、明確なルールを設けることが重要だと強調されていました。こうすることで、後からデータを保存したくなったときも、クラス名を変えずにActiveRecordを継承させることができます。\u003C/p>\u003Cp name=\"e7da30fd-3184-4438-9d40-9f7afc9b3f4f\" id=\"e7da30fd-3184-4438-9d40-9f7afc9b3f4f\">さらに、モデルを分割する判断基準についても詳しい解説がありました。モデルの分割を検討する際、コード量が増えたことを理由に分割を考えがちですが、Rails wayに従っていればコードが負債になることは少ないと五十嵐さんは説明していました。逆に、無理に分割してRails wayから外れた設計をすると、メンテナンスが困難になるケースがあるとのことです。では、どのようなケースで分割を検討すべきでしょうか……？\u003C/p>\u003Cp name=\"5bb9faaa-ca22-43a4-bdb5-aa789e760f90\" id=\"5bb9faaa-ca22-43a4-bdb5-aa789e760f90\">1つの指標として、バリデーションを条件分岐したくなった時に、モデルの分割を検討すると良いそうです。 モデルのバリデーションでは「フォームから入力された値の検証」と、「DBへ保存する値の検証」の２つの責務を持っており、通常はこの共有が上手く機能するそうです。しかし、DBへの入力とは異なるバリデーションをしたくなった場合に、フォームオブジェクトを作成し、フォームから入力された値の検証のみの責務を持ったクラスを作ると良いとのことでした。\u003C/p>\u003Cp name=\"6465b699-ccad-4d6a-bbd0-f13dac995c50\" id=\"6465b699-ccad-4d6a-bbd0-f13dac995c50\">\u003Cstrong>【感想】\u003Cbr>\u003C/strong>Railsの魅力は、複雑さを吸収し、開発者が判断基準をRailsに委ねることで快適な開発が可能になる点です。そして、RailsはMVCモデルに基づく原則があります。\u003C/p>\u003Cp name=\"fb242611-7d5f-4bc5-b998-70242a5fe3be\" id=\"fb242611-7d5f-4bc5-b998-70242a5fe3be\">処理をどこで行うかを考える場合、MVCの3択のどれかで迷い、3択のどれにも当てはまらない場合に、サービス層などの新たな選択肢を増やす決断をされる方もいらっしゃるかと思います。 それが悪いことではないですが、層を増やすことはRailsのメリットを壊すことであり、Rails wayから外れてしまいます。 MVCの3択のいずれかに当てはめつつ、MVCの中で適切に分割していくことでRailsの恩恵を最大限に受けられるのだと、本セッションを聞いて改めて感じました。\u003C/p>\u003Cp name=\"d6cf5ffa-489e-4ce1-bde4-774651c3cb0c\" id=\"d6cf5ffa-489e-4ce1-bde4-774651c3cb0c\">特にバリデーションに関しては、「DB用」と「フォーム用」の２つの役割を共有しているのはRailsのよくできたところですが、意識していないと無理やり共通化させてしまい、歪な条件分岐の発生でコードの可読性が落ちていくケースがあるなと感じました。\u003C/p>\u003Cp name=\"13b2d0f5-bda0-41e2-ae1b-5e631b76c8b6\" id=\"13b2d0f5-bda0-41e2-ae1b-5e631b76c8b6\">私も、バリデーションが持つこの２つの役割をごっちゃに考えていたので、明確に２つの役割を持っていることを意識して開発をしていこうと思いました。\u003C/p>\u003Cp name=\"64d7c110-5fc6-47f5-9bdb-7b5b1fd1b8a0\" id=\"64d7c110-5fc6-47f5-9bdb-7b5b1fd1b8a0\">「イベント型モデル」については、昨年のKaigi on Rails 2023で諸橋さんが詳しく解説しており、興味のある方はぜひ以下のリンクもご覧ください。\u003C/p>\u003Cp name=\"5ec52514-c1b4-4545-8ba8-4cf0a9474e87\" id=\"5ec52514-c1b4-4545-8ba8-4cf0a9474e87\">▼諸橋さんの講演\u003C/p>\u003Cp name=\"0da24711-5c97-43c4-8fde-74c81d400adb\">\u003Ca href=\"https://kaigionrails.org/2023/talks/moro/\" target=\"_blank\" rel=\"noopener noreferrer\">https://kaigionrails.org/2023/talks/moro/\u003C/a>\u003C/p>\u003Cp name=\"15886ccf-3282-4275-b1d0-d5c38dfa51bd\" id=\"15886ccf-3282-4275-b1d0-d5c38dfa51bd\">実は五十嵐さんも、この講演に感化され、今年のKaigi on Railsでの登壇を決意されたそうです！ 私も昨年諸橋さんの講演に感銘を受けた一人ですが、今回の五十嵐さんの講演を聞いて改めて昨年の動画を見直し、Rails wayへの理解が一層深まりました。 モデルの責務を明確に捉えるとともに、モデルの適切な分割をしていくことで、Rails wayに沿った開発ができるのだということを再認識できた素晴らしい講演でした！\u003C/p>\u003Chr>\u003Ch2 name=\"9b24c5b0-4796-41ab-90d9-264c6f0c7925\" id=\"9b24c5b0-4796-41ab-90d9-264c6f0c7925\">大杉貫剛の感想まとめ\u003C/h2>\u003Ch3 name=\"b4b78882-a3f7-482f-b2dd-2ca9cf5bb22c\" id=\"b4b78882-a3f7-482f-b2dd-2ca9cf5bb22c\">「\u003Ca href=\"https://kaigionrails.org/2024/talks/corocn/\" target=\"_blank\" rel=\"nofollow noopener\">Rails APIモードのためのシンプルで効果的なCSRF対策\u003C/a>」\u003C/h3>\u003Cp name=\"0f9ec2e8-5e2c-47c3-9230-58cf731491f8\">\u003Ca href=\"https://speakerdeck.com/corocn/kaigionrails-2024-csrf\" target=\"_blank\" rel=\"noopener noreferrer\">https://speakerdeck.com/corocn/kaigionrails-2024-csrf\u003C/a>\u003C/p>\u003Cp name=\"e04d5b41-91aa-4d32-a6d1-2b9964b41af6\" id=\"e04d5b41-91aa-4d32-a6d1-2b9964b41af6\">\u003Cstrong>【概要】\u003Cbr>\u003C/strong>フロントエンドとバックエンドを分離したアプリケーションの作成におけるCSRF対策について解説する内容でした。フルスタックフレームワークであるRailsは、トークンを発行してCSRFを対策しています。このRail wayに乗ることをお勧めしますが、APIモードでRailsを使用する場合には、このRail wayから外れることになります。その場合、フロント側へのトークンの送受を自身でコーディングする必要があり、非常に難解です。\u003C/p>\u003Cp name=\"d19d0b8c-5429-40c2-9cba-fbf17509a73f\" id=\"d19d0b8c-5429-40c2-9cba-fbf17509a73f\">この課題に対する対策方法は、リクエストの出どころを確認するということでした。ここで注目すべきは、Rails wayで採用されているトークン方式とは全く異なるアプローチであることです。これはブラウザが送信してくれるoriginヘッダーを利用することで、リクエスト元を確認し、制御する方法です。最近になって全てのブラウザにおいてoriginヘッダーが送信されるようになったことで、可能になった対策と言えます。\u003C/p>\u003Cp name=\"b5eacbfa-5282-423c-bf5a-aa4f03308f92\" id=\"b5eacbfa-5282-423c-bf5a-aa4f03308f92\">また、より安全に対策するならば、cookieが自動で送信されないようにすることも有効とのことでした。3rd party Cookieの制御目的で作られたCookieのSamesite属性を用いる方法で、一部のクロスサイトリクエストでのみcookieを送信するLaxを指定します。Rails6.1以降ではデフォルト値でLaxとなっていますが、自身でSamesite属性を指定することもできます（\u003Ca href=\"https://railsguides.jp/configuring.html#config-action-dispatch-cookies-same-site-protection\" target=\"_blank\" rel=\"nofollow noopener\">Railsガイドに詳細あり\u003C/a>）。\u003C/p>\u003Cp name=\"de6c4784-1712-4a2d-bc5c-2483ecc4032b\" id=\"de6c4784-1712-4a2d-bc5c-2483ecc4032b\">\u003Cstrong>【感想】\u003Cbr>\u003C/strong>個人的にRailsというフレームワークを使っていると、まるで魔法のように意図せずとも上手い具合にできていると思うことが本当に多々あり、いつもRailsの凄さを実感します。Kaigi on Railsは、そんなRailsの魔法を業界のエンジニアの皆さんが、丁寧に紐解いて解説してくれる感覚があり、本公演もまさにRailsの魔法を紐解く内容でした。\u003C/p>\u003Cp name=\"17790e1f-837d-4e5e-8695-66b95fec193c\" id=\"17790e1f-837d-4e5e-8695-66b95fec193c\">APIモードでの利用時に直面する課題と解決策を学ぶ中で、CSRF対策を普段あまり意識せずとも、セキュリティが担保されていたのが、やはりRails wayに乗っ取っていたからであったことを再認識しました。翻り、今回のようにフルスタックでRailsを使用することなく、Rails wayから外れてしまうような場合に、いかに今回で言えばセキュリティ対策を自分自身で実装するかということが大切で、そのためにはやはりRailsの仕組みを正しく理解しておくことが重要であると感じました。\u003C/p>\u003Cp name=\"35ea9250-9e34-4ea8-87ba-d384c176337e\" id=\"35ea9250-9e34-4ea8-87ba-d384c176337e\">また、本公演で感銘を受けたのが、課題へのアプローチ方法です。Railsがトークンを発行して対策しているがゆえに、いかにこのトークン方式を再現するかという視点で解決策を考えてしまいがちですが、より柔軟に課題を捉え、トークン方式にとらわれない対策を紹介されていたことが印象的でした。\u003C/p>\u003Chr>\u003Ch2 name=\"05b59357-ede3-4fd0-b1bb-476b356f6f6a\" id=\"05b59357-ede3-4fd0-b1bb-476b356f6f6a\">大塚和哉の感想まとめ\u003C/h2>\u003Ch3 name=\"8794f519-4a95-4c15-9862-304b84b9e426\" id=\"8794f519-4a95-4c15-9862-304b84b9e426\">「\u003Ca href=\"https://kaigionrails.org/2024/talks/haruna-tsujita/\" target=\"_blank\" rel=\"nofollow noopener\">Hotwire光の道とStimulus\u003C/a>」\u003C/h3>\u003Cp name=\"7cbba172-fda4-4f5e-8641-88c4ada553f3\">\u003Ca href=\"https://speakerdeck.com/nay3/hotwireguang-nodao-tostimulus\" target=\"_blank\" rel=\"noopener noreferrer\">https://speakerdeck.com/nay3/hotwireguang-nodao-tostimulus\u003C/a>\u003C/p>\u003Cp name=\"77190f23-71b4-47b0-b9bf-1670715fdc4c\" id=\"77190f23-71b4-47b0-b9bf-1670715fdc4c\">\u003Cstrong>【概要】\u003Cbr>\u003C/strong>Hotwireを用いたRailsアプリケーション開発を行う上で、Stimulusにフォーカスしたクライアントサイドの設計指針のお話です。 Hotwireとは、SPAライクなWebアプリケーションを開発することができる、Rails標準のフロントエンドフレームワークです。 このフレームワークを使えば、JSコードの記述量を大幅に削減することができる一方で、使い方を誤れば逆に記述量が増えてしまい、複雑な実装となってしまう可能性もあります。\u003C/p>\u003Cp name=\"a61ba93d-c253-48ad-95bd-b450ae12cfc7\" id=\"a61ba93d-c253-48ad-95bd-b450ae12cfc7\">セッションでは、Hotwireを活かせている設計指針のことを「光の道」と表現し、どのような考え方をすればその道から外れない実装を行うことができるのか、具体例を交えながらご説明されていました。\u003C/p>\u003Cp name=\"c225b29b-d7f6-4fb7-976f-2eadd43c4d51\" id=\"c225b29b-d7f6-4fb7-976f-2eadd43c4d51\">スピーカーの大場さんは、昨年のKaigi on Rails 2023でもHotwireについて講演されており、その時は「Web紙芝居」というのがキーワードになっていました。 「Web紙芝居」とは、一言でいうと「画面の制御はサーバーサイドに集めよう」というものです。これは今回の講演でも序盤に大原則として掲げており、その上でクライアントサイドではどのようにStimulusを扱うべきかを話されています。 詳細な説明は省きますが、一言でいえば「主な画面変更はサーバーサイド（Rails+Turbo）で行い、JSでしかできない画面変更だけをStimulusにやらせよう」というのがポイントになります。登壇資料でも、図をたくさん用いてとても分かりやすく解説されているので、ぜひご覧になってみてください。\u003C/p>\u003Cp name=\"8dc92642-e90f-46ba-9876-917d2eb0d2f0\" id=\"8dc92642-e90f-46ba-9876-917d2eb0d2f0\">\u003Cstrong>【感想】\u003C/strong>\u003Cbr>Hotwireと一口に言っても、実際はTurbo、Stimulus、Stradaという3つの要素から構成されており、またTurboに関してはさらにTurbo Drive、Turbo Frames、Turbo Streams...と多くの要素で構成されています。それぞれの「責務」を明確にさせないと、かえって以前より複雑な実装になってしまうのがHotwireの難しいところです（これはどの言語のどのライブラリにおいても同じことが言えますね）。\u003C/p>\u003Cp name=\"3e6d1462-19cf-4dda-818c-adab25eb9965\" id=\"3e6d1462-19cf-4dda-818c-adab25eb9965\">しかし、昨年と今年の2講演を通じて 、TurboとStimulusのそれぞれの責務や目的がかなり鮮明になり、光の道が見えてきたように感じます。 ぜひ実践でも使えるように、まずはRails+Turboでサーバーサイドに画面制御を寄せる意識を身につけていきたいです。\u003C/p>\u003Cp name=\"df3ba1c7-56ee-48fd-8edb-9e77024e436f\" id=\"df3ba1c7-56ee-48fd-8edb-9e77024e436f\">余談ですが、私は昨年の「Kaigi on Rails 2023」も当時内定者として参加しており、大場さんの講演も実際に会場で聴講していました。\u003C/p>\u003Cp name=\"91b1306a-256e-4fd5-93ed-3590c5c035f3\" id=\"91b1306a-256e-4fd5-93ed-3590c5c035f3\">▼私が昨年書いた講演レポートはこちら\u003C/p>\u003Cp name=\"f065e69c-2017-4a12-9e7e-6eddfc695ef8\">\u003Ca href=\"https://www.wantedly.com/companies/company_8821015/post_articles/872675\" target=\"_blank\" rel=\"noopener noreferrer\">https://www.wantedly.com/companies/company_8821015/post_articles/872675\u003C/a>\u003C/p>\u003Cp name=\"3631e3a6-9cfe-44a7-a66e-1ddb2b1fba50\" id=\"3631e3a6-9cfe-44a7-a66e-1ddb2b1fba50\">昨年はHotwireに関する講演が他のカンファレンスも含めてかなり多かった印象で、まさしく「Hot」な話題だったのですが、私自身この辺に関してはかなり苦手意識があり、少し敬遠していたものでした。\u003C/p>\u003Cp name=\"d56363b0-afbf-47a5-ae8f-95f81e63c015\" id=\"d56363b0-afbf-47a5-ae8f-95f81e63c015\">しかし、実際に大場さんの講演を聴いてみると、「紙芝居」という表現を用いて、どうしてHotwireの実装が複雑になってしまうのか、その具体例を交えながら分かりやすく話されており、苦手意識が一気になくなったことを今でも覚えています。前回のアーカイブもありますので、ぜひ皆さんもご覧になってみてください（実はこの講演の最後に「Hotwireの光の道」という言葉が出てきます。1年越しの続編ということが伺えますね）。\u003C/p>\u003Cp name=\"504afaf6-675c-41bc-931e-e3656a911881\" id=\"504afaf6-675c-41bc-931e-e3656a911881\">▼アーカイブ\u003C/p>\u003Cp name=\"7aea5b97-a5d6-446b-ad2a-2bba1936bae2\">\u003Ca href=\"https://kaigionrails.org/2023/talks/nay3/\" target=\"_blank\" rel=\"noopener noreferrer\">https://kaigionrails.org/2023/talks/nay3/\u003C/a>\u003C/p>\u003Cp name=\"da1fed82-e745-429d-a147-120d7054c1cf\" id=\"da1fed82-e745-429d-a147-120d7054c1cf\">「紙芝居」や「光の道」など独特の表現で聴講者を惹きつけ、視覚的にも分かりやすく講演をしてくださる大場さん、今から既に次回の講演が楽しみです。\u003C/p>\u003Chr>\u003Ch2 name=\"c8a5c852-f06f-4360-a1c5-7057644fbce8\" id=\"c8a5c852-f06f-4360-a1c5-7057644fbce8\">小林駿の感想まとめ\u003C/h2>\u003Ch3 name=\"9431ec1e-f25b-4762-a9f5-de802b1660b1\" id=\"9431ec1e-f25b-4762-a9f5-de802b1660b1\">「\u003Ca href=\"https://kaigionrails.org/2024/talks/ydah/\" target=\"_blank\" rel=\"nofollow noopener\">作って理解するRDBMSの仕組み\u003C/a>」\u003C/h3>\u003Cp name=\"edcfc091-f9e7-4420-9358-0dea4de674b2\">\u003Ca href=\"https://speakerdeck.com/ydah/zuo-tuteli-jie-suru-rdbmsnosikumi\" target=\"_blank\" rel=\"noopener noreferrer\">https://speakerdeck.com/ydah/zuo-tuteli-jie-suru-rdbmsnosikumi\u003C/a>\u003C/p>\u003Cp name=\"23e5e86d-271b-4e42-8fe2-e7bfdf46fac3\" id=\"23e5e86d-271b-4e42-8fe2-e7bfdf46fac3\">\u003Cstrong>【概要】\u003C/strong>&nbsp;\u003Cbr>RDBMS（関係データベース管理システム）の全体像とその一般的なアーキテクチャ、データ構造とアルゴリズムについて詳細に説明されていました。\u003C/p>\u003Cp name=\"e6300f9b-e2ea-4ce9-95ae-21a0ebc2ea96\" id=\"e6300f9b-e2ea-4ce9-95ae-21a0ebc2ea96\">まず、RDBMSの基本的な仕組みと動作を理解するための枠組みが提供されました。RDBMSの主要コンポーネントとしては、構文解析器、プランナ/オプティマイザ、クエリエクスキュータ、バッファプールマネージャ、ディスクマネージャがあり、それぞれが重要な役割を果たしています。構文解析器はクエリを解析してAST（抽象構文木）を生成し、プランナ/オプティマイザはASTを基に最適なクエリ実行計画を立案します。クエリエクスキュータは実行計画に従ってデータアクセスと操作を行い、バッファプールマネージャはメモリキャッシュ管理とページ置換を行ってディスクアクセスを最小化します。ディスクマネージャはデータの物理的な読み書きを管理し、永続化と整合性を保証します。\u003C/p>\u003Cp name=\"3fd269d9-523a-4a2f-a695-28a61df45217\" id=\"3fd269d9-523a-4a2f-a695-28a61df45217\">次に、データの格納方法や検索アルゴリズムについて解説されました。データファイルの構造にはヒープファイル、ハッシュファイル、インデックス構成表があり、それぞれ異なる方法でデータを格納します。ヒープファイルはデータが挿入順に格納され、ハッシュファイルはハッシュ関数に基づいてデータを格納します。インデックス構成表はデータがインデックス構造に格納されます。\u003C/p>\u003Cp name=\"e6e8480e-5d2d-4db5-a099-6e22095b9bc5\" id=\"e6e8480e-5d2d-4db5-a099-6e22095b9bc5\">インデックスの種類にはBtree、Hash、GIN、GiST/SPGiSTがあり、用途に応じて使い分けられます。Btreeは等価検索や範囲検索に適した一般的なツリー構造で、Hashは長い文字列データの等価検索に最適です。GINは多対多の関係を持つデータの検索に適しており、GiST/SPGiSTはさまざまなデータ型や演算子に対応可能です。\u003C/p>\u003Cp name=\"4cca3baa-1029-4c10-b66e-cbd5d6f07d0c\" id=\"4cca3baa-1029-4c10-b66e-cbd5d6f07d0c\">特に、B+treeの詳細な構造についても解説されました。B+treeはBtreeの一種で、データを全てリーフノードに格納し、内部ノードには索引だけが保存される構造です。リーフノードは連結リストでつながっており、範囲検索や順次アクセスが効率的です。B+treeの操作はO(log n)の時間で行え、範囲検索がさらに効率的です。利点としては範囲検索が高速である一方、挿入や削除にはオーバーヘッドが伴います。\u003C/p>\u003Cp name=\"fa6cbc63-226b-4b80-9d9c-21f532bd5964\" id=\"fa6cbc63-226b-4b80-9d9c-21f532bd5964\">B+treeの構造や意図を理解し、適切なインデックスを作成することが重要です。カーディナリティが低いカラムに対するインデックスは遅く、複合インデックスの使用方法にも注意が必要です。B+treeの構造を理解することで、効果的なインデックスの利用が可能になります。\u003C/p>\u003Cp name=\"e084905a-b087-4466-a9df-e23cf3670922\" id=\"e084905a-b087-4466-a9df-e23cf3670922\">\u003Cstrong>【感想】\u003Cbr>\u003C/strong>本セッションは、Kaigi on Railsの中で唯一、RubyやRailsの話が一切ないセッションであり、当社技術顧問の松田さんも「トランプのジョーカー」とおっしゃっていました。どんな内容になるのか、セッション前から非常にワクワクしていました。\u003C/p>\u003Cp name=\"0b138906-9427-4393-b1a8-c3f2c5def085\" id=\"0b138906-9427-4393-b1a8-c3f2c5def085\">セッションでは、RDBMSの全体像や主要コンポーネント、データ構造とアルゴリズムについて詳しく解説されました。特に、構文解析器やクエリエクスキュータ、バッファプールマネージャなどの役割と連携について学び、RDBMSがどのように効率的に動作しているのかを理解できました。また、B+treeの構造や効率性についても学び、データベースの設計や最適化に対する視点が広がりました。 RDBMSをただのデータストアとしてではなく、その内部構造や動作を意識しながら扱うことができるようになりました。\u003C/p>\u003Cp name=\"7947d631-e94c-40c8-86d9-fabd09b7d3fc\" id=\"7947d631-e94c-40c8-86d9-fabd09b7d3fc\">カンファレンスやセッションを通して、技術に対するモチベーションが大いに向上し、さらに知識を深めていこうという意欲が湧いてきました。今回のKaigi on Railsへの参加とセッションへの参加は、私にとって非常に有意義な経験となりました。学んだことを業務に活かし、より良いプロダクトを提供できるよう努めてまいります。\u003C/p>\u003Chr>\u003Ch2 name=\"bec7d95c-32b2-4b17-acc7-23f4da5d03f3\" id=\"bec7d95c-32b2-4b17-acc7-23f4da5d03f3\">佐藤智希の感想まとめ\u003C/h2>\u003Ch3 name=\"6ba99c54-15dd-4523-8066-8039f19f3d42\" id=\"6ba99c54-15dd-4523-8066-8039f19f3d42\">「\u003Ca href=\"https://kaigionrails.org/2024/talks/hatsu38/\" target=\"_blank\" rel=\"nofollow noopener\">約9000個の自動テストの時間を50分から10分に短縮、偽陽性率(Flakyテスト)を1%以下に抑えるまでの道のり\u003C/a>」\u003C/h3>\u003Cp name=\"eb32857e-c75e-45bf-96fe-a5a59a2e2a48\">\u003Ca href=\"https://speakerdeck.com/hatsu38/yue-9000ge-nozi-dong-tesutono-shi-jian-wo50fen-10fen-niduan-suo-flakytesutowo1-percent-yi-xia-niyi-etahua\" target=\"_blank\" rel=\"noopener noreferrer\">https://speakerdeck.com/hatsu38/yue-9000ge-nozi-dong-tesutono-shi-jian-wo50fen-10fen-niduan-suo-flakytesutowo1-percent-yi-xia-niyi-etahua\u003C/a>\u003C/p>\u003Cp name=\"998908bd-deac-4001-93d9-f4fe0e9e8e42\" id=\"998908bd-deac-4001-93d9-f4fe0e9e8e42\">\u003Cstrong>【概要】\u003Cbr>\u003C/strong>約9000個の自動テストを50分から10分に短縮し、偽陽性率（Flakyテスト）を1%以下に抑えるための具体的な取り組みについて学びました。実際のプロジェクトでの経験を基に、さまざまな改善策が詳しく説明されました。本セッションに興味を抱いたのは、実務でMinitestをCIに導入したことがきっかけです。現在、自社ではCI実行時間が10分ほどで収まっていますが、将来的にテスト数が増加する可能性があるため、事前に予防策を模索するために参加しました。\u003C/p>\u003Cp name=\"c5d3d383-ae11-46e1-84c6-3e6c674cf286\" id=\"c5d3d383-ae11-46e1-84c6-3e6c674cf286\">2023年時点で、プロジェクトではテスト数が7800以上あり、CI実行時間が50分を超えていました。また、Flakyなテストも多数存在していました。理想は5分以内、遅くても10分以内に完了させることを目指して、以下の具体的な取り組みが行われました。その結果、CI実行時間を10分まで短縮することができました。\u003C/p>\u003Cul name=\"d31d3958-78d9-4a1d-9070-ffe8de398ebb\" id=\"d31d3958-78d9-4a1d-9070-ffe8de398ebb\">\u003Cli>\u003Cp name=\"71dfc645-02cb-45b6-8318-74e2ec6dc6e9\" id=\"71dfc645-02cb-45b6-8318-74e2ec6dc6e9\">Capybaraの機能に任せてSleepを削除\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"186b7eed-5bb4-4344-a1aa-e2df901039de\" id=\"186b7eed-5bb4-4344-a1aa-e2df901039de\">Loadingを動的に待つHelperを作成し、Sleepを削除\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"bd717746-04a6-49f0-931d-50f6100d4d68\" id=\"bd717746-04a6-49f0-931d-50f6100d4d68\">test-profのbefore_allを使用してデータ作成を省略\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"f3c89b55-e84d-48b9-953f-6470fddc97dc\" id=\"f3c89b55-e84d-48b9-953f-6470fddc97dc\">test-profのlet_it_beを使用してデータ作成を省略\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"e729e07a-fad9-480f-82ff-cb8f98b2a321\" id=\"e729e07a-fad9-480f-82ff-cb8f98b2a321\">parallel_testsの並列実行を活かすためにファイルを分割\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"14f1f31d-72c2-4fb5-9e52-f63cc728e8eb\" id=\"14f1f31d-72c2-4fb5-9e52-f63cc728e8eb\">FactoryBot.create()ではなくFactoryBot.build_stubbed()を使用\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"7a45b4f2-2730-4b17-a4d9-f80336312701\" id=\"7a45b4f2-2730-4b17-a4d9-f80336312701\">分けなくていいテストは1つのit do ~ endにまとめる\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"cc6bcd73-659f-4def-8102-9a64bd288347\" id=\"cc6bcd73-659f-4def-8102-9a64bd288347\">不要な機能やテストの削除\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"30711049-d8a4-41ca-bbd7-8f5b3ce673b2\" id=\"30711049-d8a4-41ca-bbd7-8f5b3ce673b2\">Loadingを待つ処理も可能なら削除\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"be6b239d-17f5-4f4f-8859-b57fa68b9a96\" id=\"be6b239d-17f5-4f4f-8859-b57fa68b9a96\">KnapsackPro gemの利用\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"cc358de3-72d2-4c2c-9451-c4c9f387d137\" id=\"cc358de3-72d2-4c2c-9451-c4c9f387d137\">遅いテストファイル、遅いテスト、過去に失敗したテストをダッシュボード化\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"d6b72c5d-5a0e-4d17-a419-ec8ca213c938\" id=\"d6b72c5d-5a0e-4d17-a419-ec8ca213c938\">Next.jsのBuildをキャッシュ化\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"32338301-869c-4a21-a57d-c6ed9968708b\" id=\"32338301-869c-4a21-a57d-c6ed9968708b\">capybara-playwright-driverの追加\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"b2ee2a03-e7aa-40b3-8a65-f49241196460\" id=\"b2ee2a03-e7aa-40b3-8a65-f49241196460\">AllureReportの追加\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"76703faf-6b61-4e51-930b-535b05773f0b\" id=\"76703faf-6b61-4e51-930b-535b05773f0b\">GitHubのAllureReportのリンクBot\u003C/p>\u003C/li>\u003C/ul>\u003Cp name=\"de370d40-28c3-4e38-aa54-2cc1d66b740c\" id=\"de370d40-28c3-4e38-aa54-2cc1d66b740c\">\u003Cstrong>【感想】\u003Cbr>\u003C/strong>登壇後、スピーカーの方に自社で使用しているMinitestでも同じ対策が可能かどうかを直接聞いてみたところ、Minitestでも同様の対策が可能であり、テスト結果をレポート化してLookerでダッシュボード化することや、E2Eテストを細かく分けることがCI実行の短縮に繋がるとアドバイスを頂きました。\u003C/p>\u003Cp name=\"9b693a85-cb65-46b2-b675-df0d42a26163\" id=\"9b693a85-cb65-46b2-b675-df0d42a26163\">私にとって、新卒でカンファレンスに参加し、実際のスピーカーと会話することは貴重な体験となりました。まだ知識が不足しているため、分からない用語が多くうまく質問することはできませんでしたが、スピーカーの方がこちらの言いたいことをうまく汲み取ってくださり、感謝しています。\u003C/p>\u003Cp name=\"622a070a-aef1-4f10-9e16-eeda8b80ac3e\" id=\"622a070a-aef1-4f10-9e16-eeda8b80ac3e\">セッションを通じて、多くの企業がCIで自動テストを実行している際に実行時間が10分を超えていることを知りました。また、Flakyなテストについても詳しく学びました。Flakyなテストとは、コードに変更がないにもかかわらず、テストが成功したり失敗したりと不安定な実行結果になるテストのことです。自社のCIにもFlakyなテストが数個存在しており、将来的に修正する際に工数が大きくかかってしまう可能性があるため、早急に修復しなければならないと感じました。\u003C/p>\u003Cp name=\"9b24c1b8-4c2f-4167-80e1-3d021325977e\" id=\"9b24c1b8-4c2f-4167-80e1-3d021325977e\">また、セッションやスピーカーとの会話を通じて、自社がMinitestを採用している理由が曖昧であったため再度調べてみました。自社のテストガイドラインでは、テストをシンプルに保ち、必要以上にテストを書かないことが強調されています。MinitestはRailsのデフォルトテストフレームワークであり、シンプルなテスト環境を提供します。これにより、テストの複雑さを避け、ビジネスロジックに集中できる利点があります。テストライブラリ一つ取っても多くの要因があることを実感するとともに、会社ごとのサービスや使用しているライブラリによってエンジニア文化が異なることを学ぶことができました。\u003C/p>\u003Cp name=\"47b9970f-707a-4e4d-8d91-b9af3b61d362\" id=\"47b9970f-707a-4e4d-8d91-b9af3b61d362\">昨年の「Kaigi on Rails 2023」に自主参加しており、その当時はどのセッションを聞いても全く理解できませんでした。今年の「Kaigi on Rails 2024」も理解できないのではないかと不安が大きかったですが、1年で成長を実感できるカンファレンスとなりました。全く分からない状態から少しは触ったことがあるレベルまで進歩し、自分の成長を感じることができました。来年はスピーカーのみならず、カンファレンスに参加している人々とフランクに技術的な相談ができるように知識を養っていくことと、スピーカーとして登壇できるよう邁進したいと思います。\u003C/p>\u003Chr>\u003Ch2 name=\"2a15817b-1dbe-4831-b876-1ea3c0feda85\" id=\"2a15817b-1dbe-4831-b876-1ea3c0feda85\">金子の感想まとめ\u003C/h2>\u003Ch3 name=\"84fc72b3-37e1-489f-8379-d1c8b52901b8\" id=\"84fc72b3-37e1-489f-8379-d1c8b52901b8\">「\u003Ca href=\"https://kaigionrails.org/2024/talks/expajp/\" target=\"_blank\" rel=\"nofollow noopener\">omakaseしないためのrubocop.yml のつくりかた\u003C/a> 」\u003C/h3>\u003Cp name=\"ad4a5ef5-e1da-4e81-b7ed-8df909144336\">\u003Ca href=\"https://speakerdeck.com/linkers_tech/how-to-build-your-rubocop-dot-yml-to-avoid-omakase\" target=\"_blank\" rel=\"noopener noreferrer\">https://speakerdeck.com/linkers_tech/how-to-build-your-rubocop-dot-yml-to-avoid-omakase\u003C/a>\u003C/p>\u003Cp name=\"de051085-c2b9-42b5-b3a8-042590ddaaf6\" id=\"de051085-c2b9-42b5-b3a8-042590ddaaf6\">\u003Cstrong>【概要】\u003Cbr>\u003C/strong>ご登壇されたのは、リンカーズ株式会社のShu Oogawara(@expajp)さんです。\u003C/p>\u003Cp name=\"a02efe07-28eb-47d7-bda6-e80ae23bc091\" id=\"a02efe07-28eb-47d7-bda6-e80ae23bc091\">RuboCopは、コードスタイルをチームで統一するのに便利なツールです。一方で、その設定は個人の好みに依るところが大きく、物議を醸すことが多いのも事実です。登壇者のOogawaraさんのチームでも、同様の悩みを抱えられていたそうです。\u003C/p>\u003Cp name=\"8f24d649-440e-4236-a2ad-4550dac4c283\" id=\"8f24d649-440e-4236-a2ad-4550dac4c283\">本セッションでは、9ヶ月かけてその悩みを解消し、チームならではのrubocop.ymlを作り上げたその過程について大変有益で興味深いお話を伺うことができました。\u003C/p>\u003Cp name=\"8323d806-288e-4a17-9ca8-74d659395115\" id=\"8323d806-288e-4a17-9ca8-74d659395115\">\u003Cstrong>【感想】\u003Cbr>\u003C/strong>全体を通して大変有益で興味深い発表でした。その中でも、私が最も印象に残ったのは「そもそも.rubocop.ymlをつくるのはなぜ難しいか？」について言及された箇所です。\u003C/p>\u003Cp name=\"c2a1be5d-2823-4778-8f77-c9bd2da742f2\" id=\"c2a1be5d-2823-4778-8f77-c9bd2da742f2\">Oogawaraさんはこの問いに対して以下2つの理由を挙げられました。\u003C/p>\u003Col name=\"420607a3-a58a-4833-9156-09ff628f2f09\" id=\"420607a3-a58a-4833-9156-09ff628f2f09\">\u003Cli>\u003Cp name=\"f0e28343-5e01-4236-8568-88a560ab046b\" id=\"f0e28343-5e01-4236-8568-88a560ab046b\">直接は売上を生まないから\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"1bbd77b4-32f9-4cc1-a16c-13c50fcc08d2\" id=\"1bbd77b4-32f9-4cc1-a16c-13c50fcc08d2\">チームの文化を言語化・集約したものだから\u003C/p>\u003C/li>\u003C/ol>\u003Cp name=\"62409327-c9cf-45f9-8215-038e10927517\" id=\"62409327-c9cf-45f9-8215-038e10927517\">これは個人的に、大変クリティカルな回答だと感じました。特に2つ目の「チームの文化を言語化・集約したものだから」ですが、私はここで「文化」という言葉を用いられたのがとても素敵だと感じました。\u003C/p>\u003Cp name=\"fb95886b-52c9-41d3-b938-12b90baa7668\" id=\"fb95886b-52c9-41d3-b938-12b90baa7668\">また、Oagawaraさんは上記2つの理由は具体的に以下の問題が原因だと言います。\u003C/p>\u003Cul name=\"5e878129-c65a-46f3-ac8a-2c9437773291\" id=\"5e878129-c65a-46f3-ac8a-2c9437773291\">\u003Cli>\u003Cp name=\"d237c30c-7124-4baa-a414-6243a0b957fa\" id=\"d237c30c-7124-4baa-a414-6243a0b957fa\">売上を生まない → 時間の確保が難しい\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"0768c92c-bbf7-41ab-bdb0-2d526782274c\" id=\"0768c92c-bbf7-41ab-bdb0-2d526782274c\">文化の言語化・集約 → ファシリテーションが難しい\u003C/p>\u003C/li>\u003C/ul>\u003Cp name=\"41a44d46-bf0a-43de-9e30-f45e1c08c003\" id=\"41a44d46-bf0a-43de-9e30-f45e1c08c003\">こうした問題に対して、Oogawaraさんのチームが採用した以下の方法は大変勉強になりました。\u003C/p>\u003Cul name=\"ea25ce2d-d5d5-4169-8557-ea0f63ce758c\" id=\"ea25ce2d-d5d5-4169-8557-ea0f63ce758c\">\u003Cli>\u003Cp name=\"794b308b-13b4-4980-b14b-71dd5f905dcc\" id=\"794b308b-13b4-4980-b14b-71dd5f905dcc\">既存の定期MTGの中に時間を確保する\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"8155ac74-d4fd-4bd7-9ae4-0ff4f22e66eb\" id=\"8155ac74-d4fd-4bd7-9ae4-0ff4f22e66eb\">意見表明の幅は広く、採決ルールは細かく\u003C/p>\u003C/li>\u003C/ul>\u003Cp name=\"6a93ab20-146c-44ad-a856-66e6bd5886db\" id=\"6a93ab20-146c-44ad-a856-66e6bd5886db\">私自身、今回のようなお話を聞かずに「.rubocop.ymlをつくろう」となった際には「早急に決めて実際の開発に時間を割こう」と考えるだろう、と容易に想像できます。 これに対して、そう考えがちな原因を言語化して「既存の定期MTGの中に時間を確保する」という方法を採られたのは非常にスマートだと感じました。ぜひ、実際に真似させていただこうと思います。\u003C/p>\u003Cp name=\"ac3fa1ab-fdba-49ae-8b90-918dce695446\" id=\"ac3fa1ab-fdba-49ae-8b90-918dce695446\">また、先述の通り.rubocop.ymlは「チームの文化」ですから、まずは一人ひとりの文化の違いを尊重し、その上で最終的には1つに決定しなければなりません。大変難しいところですが、これに対して「意見を尊重するため、表明の幅は広く。ひとつに決めるため、採決ルールは細かく。」とお話いただきました。\u003C/p>\u003Cp name=\"10baceaa-50c2-4522-a378-af6dece363cc\" id=\"10baceaa-50c2-4522-a378-af6dece363cc\">これも素直に、非常に文化的でとても良い方法だと感じました。仕事に限らずこうした難しい場面にはしばしば遭遇しますが、お話しいただいた言葉を思い出したいところです。\u003C/p>\u003Cp name=\"e6a5cc62-577f-48e2-9215-d3aa88611b1f\" id=\"e6a5cc62-577f-48e2-9215-d3aa88611b1f\">最終的に、Oogawaraさんのチームでは週次MTGで時間の余裕のあるときに淡々と決定していくことで、9ヶ月かけて自分たちの.rubocop.ymlを作り上げることができたそうです。9ヶ月と聞くと驚きますが、実際には週に15分ほどの時間を割くだけなので期間中に他の業務も圧迫されず、負荷はとても小さかったそうです。すごい……。\u003C/p>\u003Cp name=\"7abf0336-acce-42cc-89d9-b08622422173\" id=\"7abf0336-acce-42cc-89d9-b08622422173\">発表の最後に「.rubocop.ymlとはチーム文化の反映であり、チームの文化は必ず移り変わっていくものです。ならば.rubocop.ymlも移り変わらなくてはならない」という言葉がありました。この言葉通り、実際に9ヶ月かけて作ったら終わりではなく、定期MTGの中で継続的にメンテナンスされているそうです。\u003C/p>\u003Cp name=\"771dfc3c-86cc-49cf-ac50-36e1c662f763\" id=\"771dfc3c-86cc-49cf-ac50-36e1c662f763\">今回の発表では、スマートで持続可能な素晴らしい方法をご紹介いただきました。ありがとうございます！それだけでなく、終始登壇者のOogawaraさんの言葉選びが光る発表で、大変面白かったです。私もいつかこんな発表ができることを目指して、日々邁進しようと思えたセッションでした。\u003C/p>\u003Chr>\u003Ch2 name=\"a6baceaa-4317-424e-91f3-6d43d54b9e21\" id=\"a6baceaa-4317-424e-91f3-6d43d54b9e21\">新井幸希の感想まとめ\u003C/h2>\u003Ch3 name=\"41625356-3334-4312-a655-8c7ab4431dbc\" id=\"41625356-3334-4312-a655-8c7ab4431dbc\">「\u003Ca href=\"https://kaigionrails.org/2024/talks/moro/\" target=\"_blank\" rel=\"nofollow noopener\">Identifying User Identity\u003C/a>」\u003C/h3>\u003Cp name=\"e6deac0e-73a3-4c55-ad8a-1a38ea83ba78\">\u003Ca href=\"https://speakerdeck.com/moro/identifying-user-idenity\" target=\"_blank\" rel=\"noopener noreferrer\">https://speakerdeck.com/moro/identifying-user-idenity\u003C/a>\u003C/p>\u003Cp name=\"40e32d0a-65f4-4bf8-832e-2bf6f4190351\" id=\"40e32d0a-65f4-4bf8-832e-2bf6f4190351\">\u003Cstrong>【概要】\u003Cbr>\u003C/strong>登壇者は諸橋恭介さんです。サービスの利用者を「ユーザー」と一括りにしがちですが、実際には事業領域ごとに適切な呼び名を付けることが重要です。これにより事業領域の理解が深まります。システム要件としてのユーザーは、サービス上で「一人」の主体として識別される単位です。\u003C/p>\u003Cp name=\"cf813b00-7c04-4791-86f6-cf974ae6ba96\" id=\"cf813b00-7c04-4791-86f6-cf974ae6ba96\">架空の「ユーザー」管理機能の実装例を通じて「利用者」をあらわす「ユーザーのアイデンティティ」とは何か、そのデータをどう永続化させるか、ランタイムではどう見えるか、といったことを考察してきます。\u003C/p>\u003Cp name=\"0eeaaf06-592d-44a2-a140-e4bc4a580112\" id=\"0eeaaf06-592d-44a2-a140-e4bc4a580112\">まず、ユーザーのActiveRecordモデルUserを定義し、以下の三つのテーブルを作成します。\u003C/p>\u003Cul name=\"29464508-44df-4869-abd3-4c4da499ac82\" id=\"29464508-44df-4869-abd3-4c4da499ac82\">\u003Cli>\u003Cp name=\"ce1a2c75-fa53-48ac-8556-029c0444b0a7\" id=\"ce1a2c75-fa53-48ac-8556-029c0444b0a7\">usersテーブル\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"8b95d4dd-d583-4d82-b41e-9ac28d91a551\" id=\"8b95d4dd-d583-4d82-b41e-9ac28d91a551\">必要なカラムは主キーとcreated_atだけで良い\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"0a5ad7a5-90b9-4a85-a1a4-82a2a8190a11\" id=\"0a5ad7a5-90b9-4a85-a1a4-82a2a8190a11\">主キーを見せたくない、UUIDなどの時は人間が見やすい代理キー（alternate key）はあってもよい\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"62c8bf0e-bf3d-4b54-8637-01de0d5d2c8a\" id=\"62c8bf0e-bf3d-4b54-8637-01de0d5d2c8a\">ほぼidだけにすることで、identityがあることそのものを表現できる\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"9b6973a5-75b2-4d6f-bf39-6db0aac182bc\" id=\"9b6973a5-75b2-4d6f-bf39-6db0aac182bc\">`belogns_to: user`データを作れる\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"afad0732-3194-403e-828b-923eef1867e8\" id=\"afad0732-3194-403e-828b-923eef1867e8\">user_credentials\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"be99f2ee-a266-44ce-880d-088d3254d51b\" id=\"be99f2ee-a266-44ce-880d-088d3254d51b\">秘密にしたいユーザーの情報(住所、メールアドレス、電話番号など)を管理する\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"e8a5d02c-dc91-46d2-abbd-8b51c51a8cc3\" id=\"e8a5d02c-dc91-46d2-abbd-8b51c51a8cc3\">退会したい時にこのデータを削除する\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"f1d02dad-3a9b-4b35-8446-1bf4170c47d3\" id=\"f1d02dad-3a9b-4b35-8446-1bf4170c47d3\">user_priofiles\u003C/p>\u003C/li>\u003Cli>\u003Cp name=\"458de22d-aa49-4ac3-8b58-f467591c632a\" id=\"458de22d-aa49-4ac3-8b58-f467591c632a\">そこまで秘密にしなくても良い情報（region、お気に入りなど）を管理する\u003C/p>\u003C/li>\u003C/ul>\u003Cp name=\"4fab8876-3371-4b1e-b9e6-ea4cbf70218c\" id=\"4fab8876-3371-4b1e-b9e6-ea4cbf70218c\">これにより、usersテーブルに情報が残ったままユーザーの状態を表現できます。退会時にはuser_credentialsを削除するだけで、usersテーブルは変更せずに退会ユーザーを管理可能です。\u003C/p>\u003Cp name=\"6657bfb0-acc0-41e9-a85d-b22afacd75a4\" id=\"6657bfb0-acc0-41e9-a85d-b22afacd75a4\">次に、ログイン機能の説明がありました。ログイン機能は大きく二つに分かれます。「各機能にてログインしているユーザーを判別する機能」と「ログイン操作そのものの機能」です。\u003C/p>\u003Cp name=\"c42f9671-2220-4cf6-9ef9-3c0608a7e418\" id=\"c42f9671-2220-4cf6-9ef9-3c0608a7e418\">まず前者についてですが、リクエストの操作主体が、このアイデンティティを持った存在である、ことがわかれば良いと説明されていました。 Railsで何かしらの実装している人ならば馴染みの深い`ApplicationController#current_user`的なメソッドで、usersテーブルから検索しUserを検索し、Userインスタンスを取得します。これが非ログイン中ならnilを返して終わりです。この考え方はAPIでも同様で参照元がJWTやBearerトークンだけです。current_userを使って、各種機能内で当該Userのデータを読み書きできます。\u003C/p>\u003Cp name=\"8037754c-15d9-4724-ab01-9a9b36810685\" id=\"8037754c-15d9-4724-ab01-9a9b36810685\">代わって後者の「ログイン操作そのものの機能」の説明ですが、本人だけが入力できるパスワードやemailなどの情報を突合し、本人確認します。この信頼性の担保やバリデーションの対応が大変で、ライブラリやIDaaSをうまく使いたいよねと話されていました。確認できたユーザーのIDはセッションに保存します。\u003C/p>\u003Cp name=\"1d54514f-86db-4e14-97f6-70f5e5a0c2d5\" id=\"1d54514f-86db-4e14-97f6-70f5e5a0c2d5\">次に、ユーザー登録についての説明がありました。ユーザーのアイデンティティは、登録フローの完了時に生まれると考えます。登録フロー中はusersテーブルにレコードを追加せず、新しいモデルを用意します。これにより途中保存やバリデーションが可能になり、usersテーブルの検索時の状態管理が簡単になります。user_credentialsに関連した列のユニーク制約をすることができます。\u003C/p>\u003Cp name=\"2ce8a4c5-b4de-4f6c-97ba-bf4d4eeb55ca\" id=\"2ce8a4c5-b4de-4f6c-97ba-bf4d4eeb55ca\">また、仕様追加を想定して、特別な権限でのログインについての説明がありました。管理スタッフと一般ユーザーは異なるアイデンティティとして扱います。usersテーブルにカラムを追加するのではなく、アイデンティティプールを分けて実装します。これにより、権限の問題を別の実装として扱い、複雑さを減らせます。\u003C/p>\u003Cp name=\"f01cb5fc-e1b4-4679-998e-4eb2d428a034\" id=\"f01cb5fc-e1b4-4679-998e-4eb2d428a034\">セッションの終盤では、「ユーザー管理」は重要なエンティティであり、複雑さが存在しますが、原則に沿って整理することで、かっこいいコードが書けると話されました。これにより、サービスの目玉機能を伸ばす役にも立てられるとのことです。 status列がなくてもテーブルの連結やデータの存在チェックでユーザーの状態を表現できるコードを説明していただき、セッションは終了しました。\u003C/p>\u003Cp name=\"cf02205b-e367-4937-9fe6-c4b5b72ff4b5\" id=\"cf02205b-e367-4937-9fe6-c4b5b72ff4b5\">\u003Cstrong>【感想】\u003Cbr>\u003C/strong>これまで、ユーザーのアイデンティティで悩んだことは数知れず、権限の扱いでも様々な問題に直面し苦労してきました。セッションを聞きながら過去のプロジェクトで経験してきた問題を思い出していました。\u003C/p>\u003Cp name=\"9272a3b9-208e-42be-815e-71be7ac4aae1\" id=\"9272a3b9-208e-42be-815e-71be7ac4aae1\">usersテーブルにさまざまな情報を持たせたくなってしまう気持ちが生まれてしまうので、今回のセッションで見たusersのテーブルを3つに分けるのは、個人的にとても綺麗な構成に見えました。特に、契約関連のステータスをどうにかするために、状態を意味するカラムを持たせたくなるところを、scopeに落とし込めるのはいいなと思いました。Kaigi on Railsの他のセッションで「標準の道具、標準の方法、必要十分で作る」という話がありましたが、それに通じるものがあるなと感じました。自分も原則に沿って実装していきたいです。\u003Cbr>&nbsp;\u003C/p>\u003Chr>\u003Cp name=\"93f117a9-e1f8-46ef-bda9-413302075bd2\" id=\"93f117a9-e1f8-46ef-bda9-413302075bd2\">\u003Cstrong>＼あなたもRIZAPのエンジニアとして働きませんか？／\u003Cbr>\u003C/strong>\u003Cbr>▽新卒採用\u003C/p>\u003Cp name=\"180eff62-b416-4b63-85b4-246d6ce1ebd0\">\u003Ca href=\"https://kikaku-recruit.rizap.jp/recruit\" target=\"_blank\" rel=\"noopener noreferrer\">https://kikaku-recruit.rizap.jp/recruit\u003C/a>\u003C/p>\u003Cp name=\"8164001a-f5ee-4748-896c-a00a458476d9\" id=\"8164001a-f5ee-4748-896c-a00a458476d9\">▽中途採用\u003C/p>\u003Cp name=\"03f9a440-a468-4c41-ade7-5e300f98076a\">\u003Ca href=\"https://www.rizap-tech.co.jp/recruit\">https://www.rizap-tech.co.jp/recruit\u003C/a>\u003C/p>\u003Cp name=\"b3c8cdd7-872d-4d88-844b-ccf04d1caa2b\">\u003Ca href=\"https://hrmos.co/pages/rizapgroup/jobs?category=1799629274565783552\" target=\"_blank\" rel=\"noopener noreferrer\">https://hrmos.co/pages/rizapgroup/jobs?category=1799629274565783552\u003C/a>\u003C/p>","RIZAPテクノロジーズのエンジニアがKaigi on Rails 2024の各講演をレポート。モデルの育て方・分割方法やRails設計の実践知見など、多様なセッションから得た学びをメンバー別に詳しく紹介。",[169,167,286,287,166],"Ruby on Rails","Kaigi on Rails",[289,290],{"title":9,"to":11},{"title":37,"to":39},[292,294,301,308,314,322],{"to":244,"image":245,"date":246,"label":163,"title":247,"tags":293},[166,167,249,250,251,169,252],{"to":295,"image":296,"date":297,"label":163,"title":298,"tags":299},"/recruit/articles/entries/278","https://rizap-tech.g.kuroco-img.app/v=1775010942/files/user/recruit/contents/thumbnail/n182bcbbc38b7_164af36cc4e4fa7eee8181438dbdd7c2.jpeg","2024.06.18","RIZAPのエンジニアが、今年もRubyKaigi に参加してきました！（2024・那覇）",[263,167,300,166],"RubyKaigi",{"to":302,"image":303,"date":304,"label":163,"title":305,"tags":306},"/recruit/articles/entries/274","https://rizap-tech.g.kuroco-img.app/v=1775010942/files/user/recruit/contents/thumbnail/n404e5831a2cd_a671798a641b43f775771b8504c5f4a3.jpeg","2024.07.08","RIZAPのエンジニアが、Kotlin Fest 2024に初参戦！ 【現場レポート】",[169,167,307,166],"Kotlin",{"to":309,"image":310,"date":311,"label":163,"title":312,"tags":313},"/recruit/articles/entries/311","https://rizap-tech.g.kuroco-img.app/v=1775010963/files/user/recruit/contents/thumbnail/nff9c502d9116_c8e9d3108662e0b51c47f68d637d593e.jpeg","2023.07.27","テックカンパニーとして本気度を見せるためにRubyKaigiでスポンサーをしてみた（前編）",[169,300,167,166],{"to":315,"image":316,"date":317,"label":163,"title":318,"tags":319},"/recruit/articles/entries/289","https://rizap-tech.g.kuroco-img.app/v=1775010953/files/user/recruit/contents/thumbnail/nb49a1d88b23b_5d415aac2e18aa18d4053b1cf00e5dfb.png","2024.03.05","RIZAPのインターン生がJaSST ‘23 ２nd Tokai に参加してきました！",[320,321,167,166],"QAエンジニア","JaSST",{"to":323,"image":324,"date":325,"label":163,"title":326,"tags":327},"/recruit/articles/entries/313","https://rizap-tech.g.kuroco-img.app/v=1775010951/files/user/recruit/contents/thumbnail/naf2d2872d581_6f06e2b038a04c77f186ddef178955d9.jpeg","2023.05.19","RIZAP がRubyKaigi 2023に初参戦！【新卒メンバー現場レポート】",[263,300,167,166],1776738989853]