こんにちは!WEBアプリケーションエンジニアの小松です!
この記事は[Enigmo Advent Calendar 2024]の17日目の記事です。
Railsの場合: 自動的に日付オブジェクトとして認識
RailsはActiveRecordのORMを利用する場合だけでなく、rawクエリを用いた場合でもdate
型はRubyのDate
オブジェクトに変換されます。そのため、日付フォーマットの変換を簡単に記述できます。
サンプルコード(Rails)
テーブル定義
# migration
create_table :events do |t|
t.date :event_date
t.timestamps
end
rawクエリの利用
result = ActiveRecord::Base.connection.execute("SELECT event_date FROM events LIMIT 1")
raw_date = result.first["event_date"] # => #<Date: 2023-12-13>
puts raw_date.strftime('%Y%m%d') # => "20231213"
ポイント
event_date
はRubyのDate
オブジェクトとして取得される。.strftime
メソッドを直接利用してフォーマットを変更可能。
Laravelの場合: 明示的な型変換が必要
Laravelでrawクエリを使用した場合、デフォルトではdate
型は文字列として取得されます。そのため、フォーマットを変更する際は、明示的にCarbon
オブジェクトなどに変換する必要があります。
サンプルコード(Laravel)
テーブル定義
// migration
Schema::create('events', function (Blueprint $table) {
$table->date('event_date');
$table->timestamps();
});
rawクエリの利用
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
$result = DB::select("SELECT event_date FROM events LIMIT 1");
$rawDate = $result[0]->event_date; // => "2023-12-13" (文字列)
$carbonDate = Carbon::parse($rawDate);
echo $carbonDate->format('Ymd'); // => "20231213"
ポイント
event_date
は文字列として取得される。- PHPの
Carbon
ライブラリを利用して明示的に日付オブジェクトに変換する必要がある。
RailsとLaravelの比較表
特徴 | Rails | Laravel |
---|---|---|
rawクエリでのdate 型の扱い |
自動的にDate オブジェクトとして認識される |
文字列として取得される |
日付フォーマットの変更 | .strftime('%Y%m%d') が直接利用可能 |
Carbon::parse($date)->format('Ymd') が必要 |
追加の変換処理の必要性 | 不要 | 必要 |
デフォルトの開発者体験 | 日付操作が非常に簡潔で直感的 | 明示的な型変換が必要で、柔軟性が高い |
適用範囲 | ActiveRecordでもrawクエリでも同じ | Eloquentとrawクエリで挙動が異なる |
開発者の観点からの結論
Railsのメリット
- 開発効率が高い: 日付型は自動的に
Date
オブジェクトとして認識され、変換処理を意識する必要がありません。 - 統一性がある: ActiveRecordでもrawクエリでも同じように扱えます。
- 時間をかけてハマる前に、まず
.to_sql
でクエリを確認 する習慣をつけると、デバッグがスムーズになります!
Laravelのメリット
Railsは「標準的な処理が簡潔」、Laravelは「柔軟性を重視」といったフレームワークの哲学の違いが、日付型の扱い方にも表れています。どちらを選ぶかはプロジェクトの要件やチームの好みに依存しますが、簡潔さを求める場合はRailsが有利です。