Sequel::Models を使って CRUD とバリデーションを試してみた

はじめに

Ruby のリハビリということで、Sequel で CRUD 処理を行うコードを書いてみました。Sequel::Model を使って、バリデーションにも挑戦しています。

下準備

テーブルの作成と、モデルの定義。データベースにはオンメモリ SQLite を使います。

require "sequel"

DB = Sequel.sqlite
DB.create_table :records do
  primary_key   :id
  Date          :date
  String        :summary
  Float         :kcal
  DateTime      :created_at
end

class Record < Sequel::Model
  # 便利な検証メソッドを使うために必要
  plugin :validation_helpers

  def validate
    validates_presence [:summary, :kcal, :date]
    validates_type String, :summary
    validates_numeric :kcal
  end
end

データ取得

filter で絞り込み、order で並び替えます。

@records = Record.filter(:date => Date.today)
                 .order(:date.desc, :created_at.desc)

主キーを指定して1件取得する場合、[]を使います。

@record = Record[1]

配列にアクセスしているように見えるのがくせ者。

データ挿入

POST データを検証して保存。

@record = Record.new(params)
if @record.valid?
  @record.save
end

create で保存することもできます。

Record.create(:date => params[:date], :summary => params[:summary])

入力検証のこと考えると、save で保存する方が良いかな。

データ更新

POST データを既存のモデルにセットする方法が見つからず苦労したけど、set でなんとか上手くいきました。

@record = Record[id]
@record.set({
  :summary => params[:summary],
  :date => params[:date],
  :kcal => params[:kcal]
})
if @record.valid?
  @record.save
end

まとめて更新する方法もあります。

Record.filter(:id => 1..5).update(:summary => "foo")

バッチ処理で使うかも。

データ削除

1件削除。

@record = Record[id]
@record.destroy

まとめて削除。

Record.filter(:id => 1..5).destroy

Rails3 の ActiveRecord に慣れてれば習得しやすい

scope じゃないし、メソッド名も違いますが、使い方が似てる。気がします。Rails3 使って開発した経験があれば、Sequel の使い方はすんなり覚える事が出来そうです。経験談。

もっと詳しく勉強したい場合は、下記のドキュメントを読むといいです。