ラブグラフのエンジニアブログのフィード
https://zenn.dev/p/lovegraph
https://corporate.lovegraph.me 出張写真撮影サービス『ラブグラフ』やオンライン写真教室『ラブグラフアカデミー』を提供しています
フィード

ポリモーフィック関連のつらみ
1

ラブグラフのエンジニアブログのフィード
ラブグラフでインターンをしているりょうさんです!前回はポリモーフィック関連についてざっくり理解をしました。https://zenn.dev/lovegraph/articles/8d965d2e19a132今回はポリモーフィック関連について理解した上でつらい部分を紹介していこうと思います!モデルや実際のコードは前回の記事(上記)を元に話していこうと思います!以下のテーブルが存在する程で話します!# db/migrate/xxxx_create_comments.rbclass CreateComments < ActiveRecord::Migration def...
3日前

【Rails】複雑なキャンセルポリシーを柔軟にテーブルで管理したい
ラブグラフのエンジニアブログのフィード
if 文だらけのキャンセル料ロジックから、DB設計での表現へ 背景:ビジネスロジックの複雑化と if 文地獄Railsアプリでキャンセル料を計算する際、現状では以下のような if 文で条件分岐を管理しています。def calculate_normal_cancellation_fee(will_cancel_at: Time.current) return 0 if will_cancel_at < date.beginning_of_day - 10.days order_price_big_decimal = BigDecimal(price.to_s)...
10日前

【Rails】悲観ロックと楽観ロックの違いを理解する
ラブグラフのエンジニアブログのフィード
はじめに ロックとは?ロックとは、複数のユーザーや処理が同じデータを同時に変更しようとしたときに、データの不整合を防ぐ仕組みです。たとえば、ある在庫数をAさんとBさんが同時に減らそうとした場合、ロックがないと最終的な在庫が意図しない数になってしまう可能性があります。 トランザクションとは?トランザクションとは、複数の処理を1つのまとまりとして扱い、すべてが成功するか、すべて失敗してロールバックするという仕組みです。これにより、データの整合性や一貫性を保証することができます。 ロックの種類 悲観ロック(Pessimistic Lock)悲観ロックは、「どうせ...
17日前

GitHub Copilot Coding Agent を使ってみて
ラブグラフのエンジニアブログのフィード
はじめにGitHub Copilot Coding Agent を使って、いくつかタスクを進めてみた感想を共有します。手動で行っていた小規模な修正作業をAIに任せたときのメリット・デメリットや、テンプレート整備の重要性が見えてきたので記事にします。 実際のワークフロー 1. Issue 作成まず、 Issue による命令が最も大事だと考えたのでテンプレートを作成しました。やって欲しいこと、目的、関連ファイルなど、作業をやってもらう上で必要となる情報を与えられるようにしています。.github/ISSUE_TEMPLATE.md## 種類 (Type of Iss...
24日前

【Rails】update_all で全件同じ値に…を回避!
ラブグラフのエンジニアブログのフィード
ステージング環境のデータの中身をサンプルデータに一気に書き換えたい時がありました。たとえば 、update_all を使って全ユーザーの名前やメールアドレスを変えようとすると、次のようなコードを書きたくなるかもしれません。User.update_all(name: "テストユーザー", email: "test@example.com")もちろんこれでも更新はされますが、全員が同じ値になってしまうという落とし穴があります。それでもいいのですが、どうせなら全部異なる値にもしてみたい🧐 問題:全件同じ値になってしまうupdate_all は SQL の UPDATE ... S...
1ヶ月前

【RSpecテスト事件簿】二要素認証テストで迷宮入りした話。犯人は...
ラブグラフのエンジニアブログのフィード
はじめにこんにちは、ラブグラフでエンジニアインターンをしているうらっしゅです!今回は、私が二要素認証の実装中に遭遇した、ある不可解な「事件」の顛末をお話ししようと思います。それは、「認証コードは完璧に合っているはずなのに、なぜか認証に失敗し続ける」という謎の事件。思わず、PCの前でこう叫びました。 いや、なんでやねん!! (魂の叫び) 事件のタイムライン順風満帆に見えた開発は、ある日を境に暗転します。 1. 二要素認証を実装。(この時点では任意設定) 2. テストも完璧。登録からログインまで、全てのテストが気持ちよくPASS。 3. 無事リリース。...
1ヶ月前

Rails のポリモーフィック関連付けについて理解する
ラブグラフのエンジニアブログのフィード
ラブグラフでインターンをしているりょうさんです!Rails には、ポリモーフィック関連付けという機能があります。これは、ある1つのモデルが他の複数のモデルに属していることを、1つの関連付けだけで表現できるという機能です。今回は、このポリモーフィック関連付けについて、あまり理解ができていなかったので、この記事を通して整理していこうと思います。 具体例以下の状況を仮定しましょう。学校における「コメント」機能を実装したいとします。生徒の日記にコメントをつけたい先生のお知らせにコメントをつけたい部活動のブログ記事にコメントをつけたい素直にコメント機能を作成しようとす...
2ヶ月前

GeminiでSQLクエリを書くのを爆速にした話
ラブグラフのエンジニアブログのフィード
こんにちは!ラブグラフ開発インターンを経て、ビジネス職で新卒入社した arawi です。ラブグラフでは非エンジニアのメンバーもデータ分析や業務効率化の目的で日々 SQL クエリを書いています。自分自身ビジネス職として新卒入社し、多くのクエリを書いています。SQL の知識はあるものの、複雑なクエリを自分で書くのは大変で、時間がかかることも多いです。AI を使っての SQL クエリ生成は以前から試していましたが、AI がドメイン知識を持っていないため、正しいクエリを生成できないのが課題でした。今日はそんな課題を解決した方法を紹介します! TL;DRGemini に DB ス...
2ヶ月前

【Rails】脱・ifネスト地獄!ビューをスッキリさせる2つのテクニック
ラブグラフのエンジニアブログのフィード
はじめにRails アプリを開発していると、ビューで複数の条件分岐(if/elsif/else)が深くネストし、コードが読みづらくなることがあります。特に Slim のようなインデントベースのテンプレートでは、ネストが深まるほど視認性が低下し、メンテナンス性も悪化します。本記事では「元の仕様を変えず」「Slim+Rails標準機能だけで」可読性を高める方法を2つ紹介します。 問題のコード例以下は「注文(Order)」モデルの状態に応じてボタンを切り替える深いネスト例です。3段階以上の入れ子になっているため、条件が増えると「なにを表示しているのか」が一目でわかりません。...
2ヶ月前

ActiveRecord::MigrationとRidgepoleを比較する
ラブグラフのエンジニアブログのフィード
1. はじめにこんにちは、ラブグラフでエンジニアインターンをしているうらっしゅです!Railsアプリケーションのスキーマ管理といえば、ActiveRecord::Migrationが定番です。しかし、チーム開発やCI/CDの整備、複数環境間の差分管理を考えたとき、Migrationの運用に限界を感じたことはないでしょうか?そこで近年注目を集めているのが、宣言的にスキーマを管理できる Ridgepole です。Schemafile という単一ファイルにスキーマの最終形を定義し、差分を検出・適用するスタイルは、Gitベースでインフラを管理する文化(Infrastructure as...
2ヶ月前

Railsにおける .explain でパフォーマンスを考える
ラブグラフのエンジニアブログのフィード
はじめにexplainメソッド を使うことで、SQLの実行計画だけでなく、実際の実行時間までをもとに調査できます。ここでは、それの使い方について実際の例も踏まえながら解説していきます※ 本記事は MySQL(8.0) を対象としています。他のRDBMS(PostgreSQLなど)とは出力項目や挙動が異なる場合があります。 そもそも EXPLAIN って何EXPLAIN は、SQLクエリがデータベース内部でどのように実行されるのかを教えてくれる「実行計画表示コマンド」です。EXPLAIN SELECT name FROM users WHERE id = 10005...
3ヶ月前

【Rails】【RSpec】書いた翌日に壊れるテスト、あなたは大丈夫?
ラブグラフのエンジニアブログのフィード
はじめに2025年4月1日。普段通りに CI を回したところ、なぜかテストが突然落ちました。コードに変更は入っていないのに、です。調査の結果、「日付を固定していなかった」ことが原因でした。これは RSpec を書き始めたばかりの方が、つい見落としてしまいがちな落とし穴です。この記事では、日付を扱うテストの落とし穴 と、その対策方法 について解説します。 テストが突然失敗するようになったある日落ちたテスト。該当の実装コードは以下のようなものでした。 実装側のコード(キャンセル料計算の例)if self.created_at < Time.zone.loca...
3ヶ月前

【Rails初心者向け】Rails 開発時の any? メソッドの使い分け
ラブグラフのエンジニアブログのフィード
ラブグラフでインターンをしているりょうさんです!Rails開発をしているとよく使うメソッドの一つにany?があります。しかし、any?にはRubyのany?とActiveRecordのany?の2種類があり、それぞれの動作や用途が異なります。実際に使ってみて「思った通りに動かない」と感じたことがある方もいるのではないでしょうか?この記事では、Ruby の any? と ActiveRecordの any? の違いについて、具体的な例を交えながら解説していきます。同じ名前のメソッドですが、それぞれどういう場面で使うべきなのかを話していきます。 比較まず、それぞれがどのような立ち...
3ヶ月前

devise-two-factorで二要素認証を実装してみよう!!
ラブグラフのエンジニアブログのフィード
はじめにこんにちは、ラブグラフでエンジニアインターンをしているうらっしゅです!今回は、devise-two-factorという二要素認証を提供するgemの紹介になります!一見難しそうに見えるこの機能ですが、今回紹介するgemを用いるとかなり簡単でかつ直感的に実装することができます。!今回紹介するdevise-two-factorのバージョンはv4.1.0です。メジャーバージョンが異なると必要なカラムや仕様がまた異なってくるので注意が必要です。 devise-two-factorとはdevise-two-factorは、Ruby on Railsアプリケーションにお...
3ヶ月前

Railsのテストで値が変わらないときはreloadを疑おう
ラブグラフのエンジニアブログのフィード
RSpecでテストを書いていて、「データが更新されているはずなのに、期待した値になっていない」と感じることがありました。その原因のひとつが ActiveRecordのキャッシュ です。ここでは、ActiveRecord + RSpecのテストで、モデルの更新が正しく検証できない問題と、reload メソッドによるその解決方法について解説します。 reload を使わないとテストが失敗することがある次のような処理を持つコントローラがあるとします。class PlansController < ApplicationController def destroy ...
4ヶ月前

Tidy First? を読んでみて
ラブグラフのエンジニアブログのフィード
リファクタリングが億劫な人にこそ読んでほしい『Tidy First?』感想変更に強いコードは小さな整頓から始まる -『Tidy First?』を読んだ話ラブグラフエンジニアのひろです!今回は『Tidy First? - 個人で実践する経験主義的ソフトウェア設計』を読んだので、その感想を書いておきたいと思います。 📖 『Tidy First?』ってどんな本?いつ・どこでコードを整頓(Tidy)するか?具体的な整頓の方法や、適切なタイミング、またなぜ整頓が必要なのかなど、具体的な手法から理論まで解説されていて、リファクタリングと機能追加のバランスに悩んだことがある方が読むと...
4ヶ月前

「それ、ActiveRecord_Relationだよ?」〜Rails初心者がハマるデータ取得の罠〜
ラブグラフのエンジニアブログのフィード
はじめにこんにちは、ラブグラフでエンジニアインターンをしているうらっしゅです!この記事はRuby初心者が勘違いをするであろうActiveRecord_Relationについて語っていきたいと思います!!以下の出力ってどうなる?User.create(id: 1, name: "urassh", email: "urassh@example.com")User.create(id: 2, name: "taro", email: "taro@example.com")User.create(id: 3, name: "syunsuke", email: "syunsuke@...
4ヶ月前

v-if と v-show のベストプラクティス
ラブグラフのエンジニアブログのフィード
ラブグラフでエンジニアインターンをしているりょうさんです!Vue.jsでUIを実装している時に、要素の出し分けをするために、条件付きレンダリングの v-if や v-show を使うケースがあると思います。今回は、どのような時にどちらを使えばいいのかというのを書いていこうと思います。 使用方法の確認 v-if通常のように書くと、<h1 v-if=isHoliday>Happy Holiday!!</h1>また、template を用いて、<template v-if=isHoliday> <h1>Today is Ho...
4ヶ月前

google-drive-ruby を脱却して google-apis-sheets_v4 でスプレッドシートにアクセス!
ラブグラフのエンジニアブログのフィード
ラブグラフでCTOをしております横江( @yokoe24 )です!Googleフォームの回答結果をGoogleスプレッドシートに出力している場合に、Googleスプレッドシートのデータを読み取ってデータベースに格納したい という場面があります。 google-drive-ruby の欠点Ruby on Rails を使っている会社では google_drive (google-drive-ruby) という gem がよく使われていました。GitHub のスター数も1,800以上ついていて、その人気ぶりが伺えます。しかしこの gem の最終更新は、2025年3月現在、Ru...
5ヶ月前

影響範囲を考えて@changeとwatchを使い分けよう!
ラブグラフのエンジニアブログのフィード
こんにちは!ラブグラフ開発インターンの筒井(@kaito_tsu2i)です!今回はセレクトボックスを使った実装の際に、Vue.js の@changeとwatchの使い方に迷ったことがあったので、どうやって使い分けるかの一例を解説したいと思います! 背景都道府県を選択できるセレクトボックスの値に応じて、市区町村のセレクトボックスの選択肢を絞り込むような機能を Vue.js を使って実装しました。その際に思いついた方法が2つありました。@changeで値が変更されるたびにメソッドを呼ぶwatchで値を監視して変更されるたびに呼ぶ両方とも同じように見えたので、どっちが適切...
5ヶ月前