スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Mongoidで値の重複チェック

名前とコードと詳細を保存するアイテムというデータを考えます。削除日時というカラムもあって、これは削除された場合ここに日付がはいります。
またコードは削除されていないアイテムの中でユニークな値とします。
バリデーションのチェックのためにvalidates_uniqueness_ofを使うとユニークであることをチェックしてくれるんですが、削除されていないアイテムという条件が考慮されません。
そこで独自のバリデーションを定義してこれを呼ぶことにしました。

独自のバリデーションはvalidateを呼んで独自のバリデーション用の関数を渡します。
独自のバリデーションではエラーが起きた時にerrors.addにエラーのあった項目とエラーメッセージを渡します。

Mongoidの話というかActiveRecordの話なような気もしますが・・・

#coding: utf-8
require 'mongoid'

class Item
include Mongoid::Document
include Mongoid::Timestamps
field :name, default: ''
field :code, default: ''
field :description, default: ''
field :delete_ts, type: DateTime
validates_presence_of :name, message: "名前を設定してください"
validates_presence_of :code, message: "コードを設定してください"
validate :my_validate

def my_validate
item = Item.first(conditions: {code: code, delete_ts: nil})
errors.add("code", "コードが重複しています") if item && item._id != _id
end
end
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。