bmf-san / sandbox-rails-multi-tenant-architecture

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

sandbox-rails-multi-tenant-architecture

Ruby on Railsでマルチテナントアーキテクチャを実装し、Railsを学ぶためのサンドボックスです。

開発環境セットアップ

  1. docker-compose up -d
  2. ./bin/rails server
  3. http://localhost:3000 にアクセス

作業記録

準備

  1. gem install rails

初期プロジェクトコード生成 cf. #1

  1. rails new . --skip-bundle --skip-test --skip-turbolinks --skip-webpack-install --database=postgresql
  2. bundle install

DBセットアップ cf. #1

  1. postgresをコンテナで起動できるようにdocker-compose.ymlを作成
  2. username、password、hostをconfig/database.ymlに追加
  3. docker-compose up -d
  4. ./bin/rails db:createでDBを作成

Deviseの導入 cf. #2

cf.hearcombo/deviseを導入する。

  1. bundle add devise
  2. rails generate devise:install
  3. development.rbに以下を追加
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  1. rails g devise User
  2. rails g devise:views
  3. rails g migration add_name_to_users name:string
  4. rails db:migrate

ActiveRecordMultiTenantの導入

active-record-multi-tenantを導入。

tenantsテーブルを作成。

各テーブルにtenant_idを追加。

各modelに以下を追加。

  multi_tenant :tenant

tenant事にデータを制御したいcontrollerに以下を追加。(application_controllerなどに共通処理として用意したほうが良さそう。)

  set_current_tenant_through_filter # Required to opt into this behavior
  before_action :set_tenant_as_tenant

  def set_tenant_as_tenant
    tenant = Tenant.find(current_user.tenant_id)
    set_current_tenant(tenant)
  end

これで、tenant_idを都度意識してデータを参照したり、書き込む必要がなくなる。

cf. ActiverecordMultiTenant でマルチテナンシー

Debugbarを導入

debugbarの手順通り導入。

簡易的なCRUDを作成

CMSっぽいものを実装。

N+1問題を解消

CRUDのN+1を解消

Bitemporalの導入

  gem 'bitemporal'
  class User < ApplicationRecord
    include Bitemporal
  end

Grapeの導入

gem 'grape`
# inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'API'
end
# config/routes.rb
  mount API => '/'

# app/api/api.rb
class API < Grape::API
  prefix 'api'

  mount V1::Posts
end

# app/api/v1/posts.rb
  module V1
    class Posts < Grape::API
      prefix 'api'
      version 'v1', using: :path
      format :json

      get '/posts' do
        Post.all
      end
    end
  end

Redisの導入

Redisを導入してキャッシュストアとして使う。

Rubocopの導入

Rubocopを導入。

group :development do
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-rspec', require: false
end
bundle exec rubocop --auto-gen-config
bundle exec rubocop -A
// or
bundle exec rubocop --auto-correct

bundle exec rubocop

bundle exec rubocop --help

RSpecの導入とテスト

  gem 'rspec-rails', '~> 6.1.0'
  gem 'factory_bot_rails'
  gem 'faker'
rails generate rspec:install
rails g rspec:model posts

capybaraの導入

  # Gemfile
  gem 'capybara'
  gem 'launchy'
  gem 'selenium-webdriver'
# Gemfile
require 'capybara/rspec`

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.include Devise::Test::IntegrationHelpers, type: :system
  config.include Warden::Test::Helpers
  config.include Capybara::DSL
end

Sidekiqの導入

  gem 'sidekiq'

rails g job sample

bundle exec sidekiq

Spring導入

  gem 'spring'

bundle exec spring binstub --all

About

License:MIT License


Languages

Language:Ruby 72.1%Language:HTML 22.8%Language:Dockerfile 2.4%Language:JavaScript 1.6%Language:CSS 0.9%Language:Shell 0.2%