0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby on Rails vs Supabase】: 比較しながら学ぶ Supabase CLI

Last updated at Posted at 2024-10-09

はじめに

Supabase CLIを学びたいけれど、どこから始めればいいか迷っていませんか?

本記事では、RailsとSupabase CLIを比較しながら、効率的な学習方法を紹介します。
既存のRails知識を活かして、Supabase CLIの基本をスムーズに習得できるよう構成しています。
Railsとの類似点や相違点を明確にしながら、Supabase CLIの特徴と使い方を解説していきます。

Rails開発者の視点から、Supabase CLIをマスターしましょう!

目次

  1. Supabaseとは?
  2. Supabase CLIの概要
  3. 環境構築の詳細比較
  4. プロジェクトのセットアップ手順
  5. データベースの管理とマイグレーション
  6. 認証機能の実装方法
  7. APIの構築と管理
  8. リアルタイム機能の実装
  9. デプロイとホスティング戦略
  10. ユースケース別のプラットフォーム選択
  11. まとめと次のステップ
  12. 参考資料

Supabaseとは?

Supabaseは、オープンソースのFirebase代替として急速に人気を集めているバックエンドプラットフォームです。
PostgreSQLを基盤としており、データベース、認証、ストレージ、リアルタイム機能、Auto-generated APIなど、モダンなアプリケーションに必要な多くの機能を提供します。

特に、以下の点が強みです:

  • オープンソース:コードが公開されており、カスタマイズや拡張が容易。
  • PostgreSQLベース:強力なリレーショナルデータベースの利点を享受。
  • リアルタイム機能:データの変更を即座にクライアントに反映。
  • Auto-generated API:データベースのスキーマから自動的にRESTful APIを生成。

これらの機能をSupabase CLIを通じてローカル開発環境で管理・開発できるため、効率的なバックエンド構築が可能です。


Supabase CLIの概要

Supabase CLIは、Supabaseプロジェクトをローカル環境で管理・開発するための強力なコマンドラインツールです。主な機能は以下の通りです:

  • プロジェクトの初期化と管理:新規プロジェクトの作成や設定の管理。
  • データベースマイグレーションの作成と適用:SQLベースのマイグレーション管理。
  • ローカル開発環境の起動:Supabaseサービスをローカルで実行。
  • 認証やストレージ設定の管理:認証プロバイダーの設定やストレージバケットの管理。
  • リアルタイム機能の設定:データベースのリアルタイム更新を有効化。

Railsでのrailsコマンドに相当する役割を果たし、開発者にとって日常的なタスクを効率化します。


環境構築の詳細比較

Ruby on Railsの環境構築

Railsの環境構築は以下のステップで行います:

  1. Rubyのインストール

    • rbenvrvmを使用してRubyのバージョン管理を行います。
    • 例:
      rbenv install 3.3.5
      rbenv global 3.3.5
      
  2. Railsのインストール

    • gemコマンドを使用してRailsをインストール。
    • 例:
      gem install rails -v 7.2.1
      
  3. データベースの設定

    • デフォルトではSQLiteが使用されますが、PostgreSQLやMySQLも選択可能です。
    • PostgreSQLを使用する場合:
      brew install postgresql
      brew services start postgresql
      
  4. プロジェクトの作成

    • 新規プロジェクトを作成します。
    • 例:
      rails new myapp -d postgresql
      cd myapp
      rails db:create
      rails server
      

Supabase CLIの環境構築

Supabase CLIの環境構築手順は以下の通りです:

  1. Node.jsのインストール

    • Supabase CLIはNode.jsベースなので、まずNode.jsをインストールします。
    • 例:
      brew install node
      
  2. Supabase CLIのインストール

    • npmを使用してCLIをグローバルにインストール。
    • 例:
      npm install -g supabase
      
  3. プロジェクトの初期化

    • 新規Supabaseプロジェクトを初期化します。
    • 例:
      supabase init
      
  4. データベースの設定

    • 初期化時にPostgreSQLの設定を行い、必要な設定ファイルが生成されます。

環境構築の比較表

項目 Ruby on Rails Supabase CLI
言語 Ruby JavaScript (Node.js)
インストール方法 gem install rails npm install -g supabase
初期化コマンド rails new supabase init
データベース Active Recordで管理 SupabaseのPostgreSQLと管理方法
認証機能 DeviseなどのGemを使用 Supabase Authを利用
リアルタイム ActionCableを使用 Supabase Realtimeを利用

プロジェクトのセットアップ手順

Railsでのプロジェクト作成

Railsプロジェクトを作成する基本的な手順は以下の通りです:

  1. 新規プロジェクトの作成

    rails new myapp -d postgresql
    cd myapp
    
  2. データベースの作成

    rails db:create
    
  3. サーバーの起動

    rails server
    

Supabase CLIでのプロジェクト初期化

Supabase CLIを使用してプロジェクトを初期化する手順は以下の通りです:

  1. プロジェクトディレクトリの作成と移動

    mkdir my-supabase-app
    cd my-supabase-app
    
  2. Supabaseプロジェクトの初期化

    supabase init
    
    • これにより、supabase/config.tomlなどの設定ファイルが生成されます。
  3. ローカル開発環境の起動

    supabase start
    
  4. マイグレーションの適用

    supabase db push
    

セットアップの比較とベストプラクティス

  • ディレクトリ構造

    • RailsはMVCアーキテクチャに基づいたディレクトリ構造を自動生成します。
    • Supabase CLIは設定ファイルやマイグレーションファイルを管理するディレクトリを生成します。
  • 依存関係の管理

    • RailsはGemfileで依存関係を管理。
    • Supabase CLIはpackage.jsonやSQLファイルで管理。
  • ベストプラクティス

    • 両者を組み合わせる場合、データベースの一貫性を保つためにマイグレーション管理を明確にすることが重要です。

データベースの管理とマイグレーション

RailsのActive Recordマイグレーション

Railsでは、Active Recordを使用してデータベースのスキーマを管理します。マイグレーションファイルを作成し、以下のコマンドで適用します。

  1. マイグレーションファイルの生成

    rails generate model User name:string email:string
    
  2. マイグレーションの適用

    rails db:migrate
    
  3. モデルの使用例

    class User < ApplicationRecord
      validates :email, presence: true, uniqueness: true
    end
    

Supabase CLIのSQLマイグレーション

Supabaseでは、SQLファイルを使用してマイグレーションを管理します。具体的な手順は以下の通りです。

  1. マイグレーションファイルの作成

    • supabase/migrationsディレクトリにタイムスタンプ付きのSQLファイルを作成します。
    • 例:supabase/migrations/20231007_create_users.sql
      CREATE TABLE users (
        id SERIAL PRIMARY KEY,
        name TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL
      );
      
  2. マイグレーションの適用

    supabase db push
    
  3. SQLファイルのバージョン管理

    • マイグレーションファイルはGitなどのバージョン管理システムで管理し、チーム全体で共有します。

マイグレーションの比較と推奨方法

項目 Ruby on Rails Supabase CLI
マイグレーション作成 rails generate model SQLファイルを手動で作成
マイグレーション適用 rails db:migrate supabase db push
ORM Active Record SQLベース(ORMはSupabase自体に含まれない)
バージョン管理 自動的にタイムスタンプ付きで管理 手動でファイル名にタイムスタンプを付与
ベストプラクティス モデルとマイグレーションを一緒に管理 SQLファイルを明確に分けて管理

推奨方法

  • RailsとSupabaseを併用する場合、データベーススキーマの管理を一元化するために、どちらか一方のマイグレーションツールに統一することが望ましいです。
  • 一般的にはRailsのActive Recordを使用することで、Railsのモデルとの整合性を保ちやすくなります。

認証機能の実装方法

RailsでのDevise導入

Railsでは、認証機能を実装するためにDeviseなどのGemを使用します。以下はDeviseの導入手順です。

  1. Gemの追加

    # Gemfile
    gem 'devise'
    
  2. Bundleインストール

    bundle install
    
  3. Deviseのインストール

    rails generate devise:install
    
  4. Userモデルの生成

    rails generate devise User
    rails db:migrate
    
  5. ルーティングの設定

    # config/routes.rb
    Rails.application.routes.draw do
      devise_for :users
      # 他のルート
    end
    
  6. ビューのカスタマイズ(必要に応じて):

    rails generate devise:views
    

Supabase Authの設定と使用

Supabaseは認証機能を標準で提供しており、設定も比較的簡単です。
以下はSupabase Authの基本的な設定方法です。

  1. 認証の有効化

    • Supabaseダッシュボードにログインし、プロジェクトを選択。
    • 「Authentication」セクションで必要な認証プロバイダー(メール、OAuthなど)を有効化。
  2. クライアント側での利用

    • SupabaseのJavaScript SDKを使用して認証フローを実装。
    • 例:ユーザーのサインアップ
      import { createClient } from '@supabase/supabase-js'
      
      const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key')
      
      // サインアップ
      const { user, error } = await supabase.auth.signUp({
        email: 'example@example.com',
        password: 'password123',
      })
      
      if (error) console.error('Error signing up:', error)
      else console.log('User signed up:', user)
      
  3. セッション管理

    • ユーザーのセッションを管理し、認証状態を保持します。
    • 例:ログイン状態のチェック
      const user = supabase.auth.user()
      if (user) {
        console.log('Logged in user:', user)
      } else {
        console.log('No user logged in')
      }
      

認証機能の比較とセキュリティ考慮

項目 Ruby on Rails (Devise) Supabase Auth
インストール Gemの追加と設定 ダッシュボードから有効化
カスタマイズ性 高(コントローラーやビューを自由に設定) API経由で設定(フロントエンド中心)
プロバイダー Gemで追加可能 標準で複数のOAuthプロバイダーをサポート
セキュリティ Railsのセキュリティベストプラクティスに依存 Supabaseがセキュリティを管理
パスワード管理 自動で暗号化(bcryptなど) Supabaseが暗号化を管理

セキュリティ考慮

  • Rails (Devise)

    • 強力なパスワード暗号化(bcrypt)。
    • セッション管理やCSRF保護など、Railsのセキュリティ機能を活用。
    • カスタム認証ロジックの実装が可能。
  • Supabase Auth

    • Supabaseが認証のセキュリティを管理。
    • JWTトークンを使用したセッション管理。
    • OAuthプロバイダーとの連携が容易。

推奨事項

  • Railsとの統合:RailsアプリとSupabase Authを統合する場合、JWTトークンをRails側で検証し、セッション管理を行うためのミドルウェアを実装する必要があります。
  • セキュリティアップデート:どちらのプラットフォームを使用する場合でも、定期的なセキュリティアップデートと監査を行いましょう。

APIの構築と管理

RailsでのRESTful API構築

Railsでは、RESTfulなAPIを簡単に構築できます。以下は基本的な手順です。

  1. APIモードでのプロジェクト作成(オプション):

    rails new myapp --api -d postgresql
    cd myapp
    
  2. コントローラーの作成

    rails generate controller Users index show create update destroy
    
  3. ルーティングの設定

    # config/routes.rb
    Rails.application.routes.draw do
      resources :users, only: [:index, :show, :create, :update, :destroy]
    end
    
  4. コントローラーアクションの実装

    # app/controllers/users_controller.rb
    class UsersController < ApplicationController
      before_action :set_user, only: [:show, :update, :destroy]
    
      def index
        @users = User.all
        render json: @users
      end
    
      def show
        render json: @user
      end
    
      def create
        @user = User.new(user_params)
        if @user.save
          render json: @user, status: :created
        else
          render json: @user.errors, status: :unprocessable_entity
        end
      end
    
      def update
        if @user.update(user_params)
          render json: @user
        else
          render json: @user.errors, status: :unprocessable_entity
        end
      end
    
      def destroy
        @user.destroy
        head :no_content
      end
    
      private
    
      def set_user
        @user = User.find(params[:id])
      rescue ActiveRecord::RecordNotFound
        render json: { error: 'User not found' }, status: :not_found
      end
    
      def user_params
        params.require(:user).permit(:name, :email)
      end
    end
    
  5. シリアライザーの導入(オプション):

    • ActiveModel::Serializersfast_jsonapiなどを使用して、JSONのフォーマットをカスタマイズ。

SupabaseのAuto-generated API活用

Supabaseでは、データベースのテーブルに対して自動的にRESTful APIが生成されます。具体的な利用方法は以下の通りです。

  1. テーブルの作成

    • SQLマイグレーションでテーブルを作成。
    • 例:supabase/migrations/20231007_create_users.sql
      CREATE TABLE users (
        id SERIAL PRIMARY KEY,
        name TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL,
        created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
      );
      
  2. マイグレーションの適用

    supabase db push
    
  3. APIの利用

    • Supabaseはhttps://your-project.supabase.co/rest/v1/usersのようなエンドポイントを自動生成。
    • 例:ユーザーの取得
      curl "https://your-project.supabase.co/rest/v1/users" \
        -H "apikey: YOUR_API_KEY" \
        -H "Authorization: Bearer YOUR_JWT_TOKEN"
      
  4. クライアント側での利用

    • JavaScript SDKを使用してAPIと通信。
    • 例:ユーザーの取得
      const { data, error } = await supabase
        .from('users')
        .select('*')
      
      if (error) console.error('Error fetching users:', error)
      else console.log('Users:', data)
      

API構築の比較と最適な選択

項目 Ruby on Rails Supabase Auto-generated API
API生成 手動でコントローラーとルーティングを設定 テーブルごとに自動生成されるREST API
カスタマイズ性 高(コントローラー内でロジックを自由に実装) 制限あり(必要に応じてEdge Functionsでカスタマイズ)
認証と権限管理 Gemやミドルウェアで実装 Supabase AuthとRow Level Securityを利用
ドキュメンテーション 手動でAPIドキュメントを作成(Swagger等) 自動生成されるAPIドキュメント(OpenAPI対応)
パフォーマンス アプリケーションレベルで最適化可能 Supabaseがインフラを最適化

最適な選択

  • RailsのRESTful API

    • 高度なカスタマイズやビジネスロジックが必要な場合に適しています。
    • 完全なコントロールが可能で、複雑な認証や権限管理を実装しやすい。
  • Supabase Auto-generated API

    • シンプルなCRUD操作が中心の場合に迅速にAPIを構築可能。
    • 開発スピードを重視し、標準的な操作を迅速に実装したい場合に適しています。

推奨事項

  • プロジェクトの要件に応じて、どちらの方法を採用するかを決定します。複雑なロジックが必要な場合はRails、迅速な開発が求められる場合はSupabaseの自動生成APIを活用すると良いでしょう。

リアルタイム機能の実装

RailsのActionCableによるリアルタイム通信

Railsでは、ActionCableを使用してWebSocketベースのリアルタイム機能を実装できます。以下は基本的な設定手順です。

  1. ActionCableの設定

    # app/channels/application_cable/connection.rb
    module ApplicationCable
      class Connection < ActionCable::Connection::Base
        identified_by :current_user
    
        def connect
          self.current_user = find_verified_user
        end
    
        private
    
        def find_verified_user
          if verified_user = env['warden'].user
            verified_user
          else
            reject_unauthorized_connection
          end
        end
      end
    end
    
  2. チャネルの作成

    rails generate channel Chat
    
    # app/channels/chat_channel.rb
    class ChatChannel < ApplicationCable::Channel
      def subscribed
        stream_from "chat_channel"
      end
    
      def unsubscribed
        # Cleanup
      end
    
      def send_message(data)
        ActionCable.server.broadcast("chat_channel", message: data['message'])
      end
    end
    
  3. クライアント側の設定

    // app/javascript/channels/chat_channel.js
    import consumer from "./consumer"
    
    consumer.subscriptions.create("ChatChannel", {
      connected() {
        console.log("Connected to ChatChannel")
      },
    
      disconnected() {
        console.log("Disconnected from ChatChannel")
      },
    
      received(data) {
        console.log("Received:", data)
        // メッセージの表示など
      },
    
      send_message(message) {
        this.perform('send_message', { message: message })
      }
    })
    
  4. メッセージ送信の実装

    • フォームからメッセージを送信し、チャネル経由でブロードキャスト。

Supabase Realtimeの活用

SupabaseはPostgreSQLのrealtime機能を活用して、データベースの変更をリアルタイムでクライアントに通知します。以下は基本的な使用例です。

  1. リアルタイムの有効化

    • Supabaseダッシュボードでrealtimeを有効化し、必要なテーブルに対してリアルタイムイベントを設定。
  2. クライアント側でのサブスクリプション

    import { createClient } from '@supabase/supabase-js'
    
    const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key')
    
    const subscription = supabase
      .from('users')
      .on('*', payload => {
        console.log('Change received!', payload)
        // データの更新処理
      })
      .subscribe()
    
    // サブスクリプションの解除
    // supabase.removeSubscription(subscription)
    
  3. イベントのハンドリング

    • データの挿入、更新、削除などのイベントに対してリアルタイムに反応。

リアルタイム機能の比較とパフォーマンス

項目 Ruby on Rails (ActionCable) Supabase Realtime
実装方法 WebSocketベースでコントローラー内に実装 PostgreSQLのrealtime機能を利用
スケーラビリティ サーバーリソースに依存 Supabaseがスケーリングを管理
クライアントサポート ActionCableのクライアントライブラリを使用 JavaScript SDKなどで簡単に設定
パフォーマンス 高トラフィック時にサーバー負荷が増加 Supabaseのインフラに依存し、高スケーラブル
開発の容易さ 設定や実装に手間がかかる場合がある 設定がシンプルで迅速に実装可能

パフォーマンスとスケーラビリティ

  • Rails (ActionCable)

    • 高トラフィック時にはサーバーのリソースがボトルネックとなる可能性。
    • 複数のサーバー間でWebSocket接続を管理するには追加の設定が必要。
  • Supabase Realtime

    • Supabaseのインフラがスケーリングを自動で管理するため、高トラフィックにも対応可能。
    • クライアント側の設定が簡単で、リアルタイム機能の実装が迅速。

推奨事項

  • Railsでの実装:高度なカスタマイズが必要な場合や、既存のRailsアプリケーションに統合する場合に適しています。
  • Supabase Realtime:迅速な開発と高スケーラビリティが求められるプロジェクトに最適です。

デプロイとホスティング戦略

Railsアプリのデプロイ方法

Railsアプリのデプロイにはさまざまな方法があります。代表的な方法をいくつか紹介します。

  1. Heroku

    • 簡単にデプロイでき、無料プランも利用可能。
    • 手順
      git init
      heroku create
      git add .
      git commit -m "Initial commit"
      git push heroku main
      heroku run rails db:migrate
      
  2. VPSや専用サーバー

    • より細かい設定やカスタマイズが可能。
    • Capistranoなどのデプロイツールを使用。
    • 手順概要
      • サーバーに必要なソフトウェア(Ruby、Bundler、データベース等)をインストール。
      • Capistranoを設定し、デプロイスクリプトを作成。
      • デプロイコマンドを実行。
  3. コンテナ化

    • Dockerを使用してコンテナ化し、Kubernetesなどで管理。
    • 手順概要
      • Dockerfileを作成。
      • Dockerイメージをビルド。
      • Kubernetesクラスターにデプロイ。

Supabaseのクラウドホスティング

Supabase自体がバックエンドサービスとしてクラウド上でホスティングされているため、基本的な設定はSupabase側で行います。

  1. プロジェクトのデプロイ

    • Supabaseダッシュボードからプロジェクトを管理。
    • supabase startでローカル開発環境を起動し、supabase db pushでデプロイを管理。
  2. フロントエンドとの連携

    • フロントエンドアプリケーション(例えばNext.jsやReact)をVercelやNetlifyにデプロイし、SupabaseのAPIと連携。
    • # Next.jsアプリをVercelにデプロイ
      vercel
      
  3. CI/CDの設定

    • GitHub ActionsやGitLab CIを使用して、自動デプロイパイプラインを構築。
    • 例:GitHub ActionsでSupabaseへのデプロイを自動化。

デプロイ戦略の比較と推奨事項

項目 Ruby on Rails Supabase Hosting
デプロイ方法 Heroku、VPS、Dockerなど多様 Supabaseがクラウドでホスティング
スケーリング 自己管理またはホスティングサービスに依存 Supabaseが自動でスケーリングを管理
フロントエンド連携 フロントエンドは別途デプロイが必要 フロントエンドとSupabaseを別々に管理
維持管理 自己管理が必要(セキュリティ、アップデート) Supabaseがインフラを管理
コスト 使用するホスティングサービスに依存 Supabaseの料金プランに依存

推奨事項

  • Railsアプリのデプロイ

    • 小規模プロジェクト:Herokuが手軽でおすすめ。
    • 大規模プロジェクト:VPSや専用サーバー、コンテナ化を検討。
  • Supabaseのホスティング

    • バックエンドサービスとしての利用:Supabaseが自動でインフラを管理するため、開発に集中できる。
    • フロントエンドとの連携:VercelやNetlifyを使用してフロントエンドをデプロイし、Supabaseと連携。

ユースケース別のプラットフォーム選択

プロジェクトの要件や規模に応じて、Ruby on RailsとSupabase CLIのどちらを選択するかを検討することが重要です。以下に、具体的なユースケースを示します。

1. スタートアップやMVP開発

  • 推奨プラットフォーム:Supabase CLI
  • 理由
    • 迅速なバックエンド構築が可能。
    • リアルタイム機能や認証が標準で提供されている。
    • インフラ管理に時間を取られず、プロダクト開発に集中できる。

2. 既存のRailsアプリケーションの拡張

  • 推奨プラットフォーム:Ruby on Rails
  • 理由
    • 既存のコードベースやエコシステムを活用できる。
    • 高度なカスタマイズやビジネスロジックの実装が容易。
    • Active Recordによるデータベース管理が一貫性を保つ。

3. リアルタイム機能が重要なアプリケーション

  • 推奨プラットフォーム:Supabase CLI
  • 理由
    • Supabase Realtimeが高スケーラビリティでリアルタイムデータを提供。
    • クライアント側の設定がシンプルで迅速。

4. 高いカスタマイズ性と制御が必要なプロジェクト

  • 推奨プラットフォーム:Ruby on Rails
  • 理由
    • フレームワーク全体を制御できるため、複雑な要件にも対応可能。
    • 多様なGemやプラグインを活用して機能を拡張。

5. サーバーレスアーキテクチャの採用

  • 推奨プラットフォーム:Supabase CLI
  • 理由
    • Supabaseが提供するBaaS(Backend as a Service)として、サーバーレス環境に適している。
    • インフラ管理が不要で、自動スケーリングが可能。

まとめ

本記事では、Ruby on RailsとSupabase CLIの詳細な比較を行いました。
環境構築、プロジェクトセットアップ、データベース管理、認証機能、API構築、リアルタイム機能、デプロイ方法など、各側面での違いと利点を解説しました。
Rails開発者がSupabase CLIを効率的に学び、プロジェクトに適したプラットフォームを選択するための指針を提供しています。
両プラットフォームの特性を理解し、プロジェクトの要件に応じて適切に選択することで、効率的な開発が可能となります。

次のステップとして、実際のプロジェクトでの適用や、より深い技術の探求を推奨します。

駄文でしたが読んでいただきありがとうございます。


参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?