概要
Ruby on Jetsを使用してDynamoDBにクエリを飛ばすようなアプリケーションを作る場合、標準の dynomite というO/Rマッパーのライブラリが使われると思われます。しかし、標準でインストールされているライブラリを使っても結局はaws-recordというgemを使ってデータを操作するのとほとんど変わらずをdynomite を使うメリットがあまり感じられませんでした。そこで今回はdynamite の代わりにDynamoDB のO/Rマッパーについてググってたら出てきた便利そうなdynamoidというO/Rマッパーのgemを使うことができるのか試してみました。
試してみる
以前書いた以下の記事の中で試したアプリケーションに機能のうち、dynomite
を使っている部分をdynamoid
に置き換えてみます。
テーブルを準備する
以下のようにテーブルを作成する
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
結果
上記の変更を加えて無事に置き換えて動かすことができました。
試してみたリポジトリはこちらです。
try-dynamoid
というブランチを切って試しています。
わかったこと
マイグレーションを使いたい場合は
dynomite
gemを使っているので完全に消すことはできない。テーブルの設定などはTerraformなどでコード化されるケースが多く、マイグレーションを作成しなくて問題ない場合が多いから、置き換えても良いケースが多いかもしれない。試してないが、dynamoidのお陰でアソシエーションなどが使えそうなので利便性が上がりそう。 https://github.com/Dynamoid/dynamoid#associations