Da Vinci Studio Blog

株式会社 Da Vinci Studio は 2023 年 7 月に株式会社 Zaim と統合し、株式会社くふう AI スタジオになりました

Ruby on RailsとLaravelの比較

Da Vinci Studio サーバー部の芳賀です。

サーバーサイドのフレームワークとしてRubyはRuby on Rails、PHPではLaravelが最も有名なものとしてあげられると思います。 これまでの経験ではLaravelを使用することが多かったのですが、最近Ruby on Railsのプロジェクトにジョインしました。 両フレームワークともにModel View Controllerを使用しており実装や処理の流れは似ており、これまで得たノウハウを活用できますが、相違点にはやはり戸惑います。

ここではLaravel視点で遭遇したRuby on Railsとの相違点を記載します。 ※以下Ruby on RailsはRailsと表記します。

ORM

findメソッドやhas_many、belongs_toなど両方に同じメソッドがありそのまま知識を流用できそうですが、全く同じ感覚で実装できないこともあります。 違いを意識したほうが実装しやすそうです。

例として下記の2条件を満たすデータを取得する際、実装が異なります。

  • リレーション先のデータをとある条件で絞り込む必要
  • データはイーガーロードする

shops(お店)とshop_items(商品)で1対多の作りになっており、商品のprice(値段)が500円以上の商品を取得したいとします。

Laravelの場合は以下となります。イーガーロードを実行する処理の中に条件式を記載します。

// Laravel

$shop = Shop::with(['shop_items' => function ($query) {
    $query->where('price', '>=', 500);
}])->find(1);

上記の処理はRailsではひとまとまりに処理を記載できないようです。

500円以上の商品をリレーション先として取得するhas_manyの処理をモデルクラスに準備する必要があります。

# Rails

class Shop < ApplicationRecord
    has_many :shop_items
    has_many :shop_items_over500yen, -> { where(price: 500...) }, class_name: 'ShopItem'
end
# Rails

shop = Shop.includes(:shop_items_over500yen).find(1)

上記のようにモデルに準備したshop_items_over500yenを記載することで、500円以上の商品を取得するリレーション先を取得できます。

マイグレーション

Laravelは以下のようにマイグレーション、ロールバックの両方を記載しなければなりません。 ここでは先のshopsテーブルにdetail(お店詳細)カラムを追加するとします。

// Laravel

public function up()
    {
        Schema::table('shops', function (Blueprint $table) {
            $table->string('detail');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('shops', function (Blueprint $table) {
            $table->dropColumn('detail');
        });
    }

RailsにはLaravelには無いchangeメソッドがあり、ロールバック処理のコードを書かなくてもロールバックします。

以下の例ですと、マイグレーションでdetail(お店詳細)カラムが追加されロールバックでdetail(お店詳細)カラムが削除されます。

# Rails

class AddDetailToShop < ActiveRecord::Migration[5.2]
  def change
    add_column :shops, :detail, :string
  end
end

バリデーション

RailsではModelクラスにバリデーションを設定します。

# Rails

validates :name, length: { in: 1..140 }, presence: true
validates :price, numericality: { only_integer: true }, presence: true

Laravelではcontrollerクラスにバリデーションを設定します。 フォームの入力値がバリデーションとなり、RailsのようにModelに依存しません。

// Laravel

$request->validate([
  'name' => 'required|size:140',
  'pricce' => 'required|integer',
]);

上記の違いはありますがフォーム自体のバリデーション処理として独立したクラスがLaravel、Railsともに用意されています。 LaravelはFormRequest、RailsはFormオブジェクトになります。 RailsでModelに紐付かないフォームの処理はFormオブジェクトで実装します。

DI(依存性の注入)

RailsにはDIの仕組みがありません。 Railsに慣れた方がLaravelを始める際はDIの方法を把握しておく必要があります。

詳細は割愛しますが、インターフェイスのタイプヒントをメソッドの引数に指定するだけでインターフェイスを実装したインスタンスとなるといった仕組みがLaravelにあります。

標準で準備されている機能が異なる

ログイン機能などLaravelで標準で準備されている機能がRails単体ではできず、ライブラリを使用して実装することがあります。 よく使われるライブラリを知っておくと開発参加時にスムーズに実装に入れそうです。

最後に

LaravelとRailsの相違点について紹介しました。 この内容が開発の戸惑いポイントの解決に少しでもお役に立てれば嬉しいです。

Da Vinci Studioでは一緒に働く仲間を絶賛募集中です。 興味のある方は こちらrecruit@da-vinci-studio.net までご連絡ください。