DynamoDB
aws-sdk
Rails5

DynamoidのCRUDまとめ

前書き

Rails5でAPIを作っている際、AWSのDynamoDBの利用が必要になったので
ORMを探したところ、DynamoidというORMが人気そうだったので、実際にCRUDで利用して見ました。

Dynamoidのインストール

gemでバージョンを指定してインストールします。

gem 'dynamoid', '~> 1'

なお、aws-sdkのv2しか対応していないため指定してaws-sdkをインストールします。

gem 'aws-sdk', '~>2'

前準備

config/initializersに

  • aws.rb(すでにある場合は編集なしです。)
  • dynamoid.rb
  • の2ファイルを作成し以下に編集します。

aws.rb

ここには、AWSのクレデンシャルの設定を記述します。

# aws.rb
Aws.config.update(Rails.application.config_for(:aws).symbolize_keys)

dynamoid.rb

ここには、Dynamoidの初期設定を記載します。
例では、namespaceをnullにしています。
Dynamoidは指定するAWSアカウント内にDynamoDBがない場合に自動で作成してくれるのですが
namespaceがnullではない場合、DB名に環境名が入るようになりますので
特に指定しない場合はnullで問題ありません。

# dynamoid.rb
Dynamoid.configure do |config|
  config.namespace = nil
end

modelの記載

DynamoDBのカラムや名称はmodel内に記述します。
idはDynamoidが自動でHash値を入れてくれます。
defaultを指定する場合は例にしたがって記述すればdefault値が代入されます。

# models/table.rb
class Table
  include Dynamoid::Document

  table :name => "TableName", :key => "id", :read_capacity => 5, :write_capacity => 5

  field :is_deleted, :integer, {:default => "0"}
  field :is_enabled, :integer, {:default => "1"}
  field :title, :string
  field :body, :string

CRUD

上述項目でDynamoidの利用ができるようになりますので
CRUDについてコード例をまとめます。

Create

  def self.create(params)
    table = new(params)
    table if table.save
  end

Read

  def self.read_all
    where(
      is_deleted: 0,
      is_enabled: 1,
    ).all
  end

Update

  def self.update(id, params)
    table = find(id)

    table if table.update_attributes(params)
  end

Delete

  def self.delete(id)
    table = find(id)

    table if table.delete
  end

ハマりポイント

CRUDの処理にハマりはありませんでしたが
ControllerからParamaterを渡す際にハマりポイントがあり

params.to_h

と、ハッシュ化する必要がありました。
渡し方の問題かもしれませんが、Paramater部でエラーが出る場合はお試しください。

後書き

ApplicationRecordと同じ形でDynamoDBが触れるので、とてもわかりやすかったです。