S3ってなんじゃ?(RUBY SDK鈍行編1 ruby on railsの準備)とタイトルがあまり繋がっていませんが、Ruby on Railsのインストールが終わったので、続いてAWSのSDKを使ったRailsアプリケーションを作ってみたいと思います。

AWS SDKでは、完全ではないですがRailsのサポートもしており、SimpleDBをRailsのORMとして利用することができます。

方法は以下のとおりです。

まず、必要なライブラリを全てインストールします。

# yum -y install ruby-sqlite3
# yum -y install sqlite
# yum -y install sqlite-devel
# yum -y install ncurses-devel
# yum -y install readline-devel

readlineのコンパイルとインストールを行います。

$ cd /usr/local/src/ruby-1.9.2-p290/ext/readline
$ ruby extconf.rb
$ make
# make install

新規にRailsアプリを作成します。
S3ってなんじゃ?(RUBY SDK鈍行編1 ruby on railsの準備)と同じものです)

# cd /var/www/html
# rails new myfirstcloud -J -T
# chown memorycraft:memorycraft -R myfirstcloud
$ cd /var/www/html/myfristcloud

bundlerでインストールするgemを定義します。
今回、sqlite3は使用しませんが、エラー回避のために便宜上入れておきます。

$ vi Gemfile

...
gem 'aws-sdk'
#gem 'sqlite3'
gem 'sqlite3-ruby', '1.2.5', :require => 'sqlite3'
...

AWSのアクセス認証用に証明書情報を定義します。
Rubyコードでの記述も可能ですが、ここではYAMLで定義します。
記法はconfig/database.ymlとほぼ同じです。

$ vi config/aws.yml

development:
  access_key_id: アクセスキー
  secret_access_key: シークレットキー

test:

production:
  SimpleDBはRDBMSではなく、キーバリューストアなのでdb:migrateは必要がなく、属性の定義はモデルで行います。
AWS SDKのSimpleDBには、仮想属性というものがあり、裏側で通常Railsでサポートしているデータ型とSimpleDBの属性が以下のようなメソッドで紐付けられています。

  • string_attr stringの属性
  • integer_attr
      integer(整数型)の属性
  • sortable_integer_attr
      値の範囲が決まっているソート可能なintegerの属性

      範囲を:rangeで指定します。
      validates_numericality_ofで最大値と最小値の制約を適用することが一般的で、もし範囲外だった場合、実行時エラーを引き起こします。

      通常のintegerとちがうところとして、SimpleDBは数値型をサポートしておらず全ての値は文字列に変換されます。
      そのため、数値でのソートに問題が生じます。たとえば2と10を昇順に並べると文字列比較のため10,2の順になってしまいます。
      このsortable_integerは、この問題に対応するため0詰めして保存されます。

  • float_attr
      float(浮動小数点型)の属性
  • sortable_float_attr値の範囲が決まっているソート可能なfloatの属性sortable_integerと同じくfloat値を0詰めで保持します。

      【正のfloat】
      たとえばsortable_float_attr :score, :range => (0..10)と指定した場合、辞書的にソートされても問題ないように5.5は05.5と文字列保存されます。

      【負のfloat】
      たとえば

    sortable_float_attr :position, :range => (-10..10)

      のように、範囲が負の値を含んでいた場合、すべての値を正になるようにマイナス分だけずらして保存されます。
      つまり000から020として保存されることにより、ソートを可能にしています。

      注意としては、こういった方式で表示したり入力したりした値と、実際に保存される値がことなるので、
      一度運用を開始した後に値の範囲を変更したい場合、保存済みの全ての値を更新する必要があるので要注意です。

  • boolean_attr
      boolean型の属性
      なにも指定しないでnewされたとき、デフォルトはfalseです。
  • datetime_attr
      日時型の属性
      created_atとupdated_atに対して指定された場合、自動管理されます。
  • timestamps
      timestamps
      datetime_attr属性のcreated_atとupdated_atを生成するための便利メソッドです。

下記では、以下のようにモデルを定義します。

$ vi app/models/my_first_domain.rb
class MyFirstDomain   string_attr :title
  integer_attr :num
  sortable_integer_attr :sort_num, :range => 0..99
  boolean_attr :bool_val
  timestamps

  validates_presence_of  :title, :num
end

ドメインがまだ存在していない場合は、Rubyコンソールから作成することも可能です。

$ rails console
> MyFirstDomain.create_domain

モデルとドメインの作成が終わったら、それ以外の部分をscaffoldで作成します。

rails generate scaffold_controller MyFirstDomain title:string num:integer sort_num:sortable_integer bool_val:boolean

最後にroutesに追加します。

$ vi config/routes.rb
Myapp::Application.routes.draw do
    # 追加
    resources :my_first_domains
end

それでは、確認してみます。

httpd.confの設定がS3ってなんじゃ?(RUBY SDK鈍行編1 ruby on railsの準備)の時と同様であることを確認したら、ブラウザでhttp://IPアドレス/my_first_domainsを開きます。
下記のとおり、my_first_domainのscaffoldのインデックス画面が確認できます。

それでは、アイテムを新規作成してみます。
試しに、Sort Numを範囲外の1000で登録しようとすると、下記のようにエラーが発生します。

これを防ぐため、モデルにvalidates_numericality_ofを追加します。

$ vi app/model/my_first_domain.rb
validates_numericality_of :sort_num, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 99

再度登録しようとすると、今度はバリデーションメッセージが表示されるようになりました。

範囲内の数値で登録すると、正常に登録が成功しました。

上記のように、RailsからもSimpleDBを使うことができました。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら