何かやってみるブログ

興味をもったこと、趣味のこと、技術について色々書きます。

[Ruby on Jets] DynamoDBのO/Rマッパーのライブラリを標準でインストールされているdynomiteの代わりにdynamoidを使って置き換えてみた。

概要

Ruby on Jetsを使用してDynamoDBにクエリを飛ばすようなアプリケーションを作る場合、標準の dynomite というO/Rマッパーのライブラリが使われると思われます。しかし、標準でインストールされているライブラリを使っても結局はaws-recordというgemを使ってデータを操作するのとほとんど変わらずをdynomite を使うメリットがあまり感じられませんでした。そこで今回はdynamite の代わりにDynamoDB のO/Rマッパーについてググってたら出てきた便利そうなdynamoidというO/Rマッパーのgemを使うことができるのか試してみました。

試してみる

以前書いた以下の記事の中で試したアプリケーションに機能のうち、dynomiteを使っている部分をdynamoidに置き換えてみます。

www.takayasugiyama.com

テーブルを準備する

以下のようにテーブルを作成する

f:id:s-takaya1027:20201201021344p:plain

dynamoid gemを追加する

gem 'dynamoid'

dynamoidを使う設定をinitializerに追加する

require 'dynamoid'
Dynamoid.configure do |config|
  # To namespace tables created by Dynamoid from other tables you might have.
  # Set to nil to avoid namespacing.
  config.namespace = Jets.config.table_namespace

  # [Optional]. If provided, it communicates with the DB listening at the endpoint.
  # This is useful for testing with [DynamoDB Local] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html).
  config.endpoint = 'http://localhost:8000'
end 

dynomiteを使っているControllerやModelをdynamoidに置き換える

class Post
  include Dynamoid::Document
  has_many :comments

  field :id
  field :content
  field :created_at
  field :updated_at
  validates :content, presence: true
end
class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :delete]

  # GET /posts
  def index
    @posts = Post.all
  end

  # GET /posts/1
  def show; end

  # GET /posts/new
  def new
    @post = Post.new
  end

  # GET /posts/1/edit
  def edit
  end

  # POST /posts
  def create
    @post = Post.create(post_params)
    if @post.save
      redirect_to post_path(@post.id)
    else
      render :new
    end
  end

  # PUT /posts/1
  def update
    if @post.update_attributes(post_params)
      redirect_to  post_path(@post.id)
    else
      render :edit
    end
  end

  # DELETE /posts/1
  def delete
    Post.where(id: @post.id).delete_all
    if request.xhr?
      render json: {success: true}
    else
      redirect_to posts_path
    end
  end

private
  # Use callbacks to share common setup or constraints between actions.
  def set_post
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:content).to_h
  end
end

結果

上記の変更を加えて無事に置き換えて動かすことができました。

試してみたリポジトリはこちらです。

github.com

try-dynamoidというブランチを切って試しています。

わかったこと

  • マイグレーションを使いたい場合はdynomite gemを使っているので完全に消すことはできない。テーブルの設定などはTerraformなどでコード化されるケースが多く、マイグレーションを作成しなくて問題ない場合が多いから、置き換えても良いケースが多いかもしれない。

  • 試してないが、dynamoidのお陰でアソシエーションなどが使えそうなので利便性が上がりそう。 https://github.com/Dynamoid/dynamoid#associations