【Rails4】管理IDを生成する実装のメモ
データの管理IDをプライマリキーとは別にカスタムで生成する際のロジックのメモです。
【用途】
データを新規登録する際に管理IDを割り当てる
イメージとしては下記です。
①データ登録画面で入力したデータをparamsで受け取る
※railsの機能で入力値はparamsで受け取ることができる
②paramsのデータを環境変数に格納する
③paramsのデータを参照し、管理IDを生成する。
【命名規則】
<category_idの頭文字> + <created_atカラムの日付のyyyy/mmの部分> + <各月ごとのデータをカウントし、シーケンス番号を振る>
例:日付が2018年4月のデータに対して
⇒ A201804_001、A201804_002、、A201804_003 . . . . . .
【実装】
def create # paramsのデータを変数に格納 ※フォームで入力された値が格納されている @item = GyomuDatum.new(item_params) # カテゴリIDのparamsを変数に格納 ※管理IDの生成に必要なため category_id = @item.category_id # manage_idの各値を生成 # categoryを値を定義 if category_id == 1 category = "S" elsif category_id == 2 category = "D" else "エラー" end # yyyymmを値を定義 now = Time.now yyyymm = now.strftime('%Y%m') yyyymm = yyyymm.to_s yyyy = now.strftime('%Y') yyyy = yyyy.to_i mm = now.strftime('%m') mm = mm.to_i # countを値を定義 time_local = Time.local(yyyy, mm, 1) # 当月のデータの数をカウントし、データ総数に1を足し、countに格納 count = GyomuDatum .where('created_at >= ?', time_local) .where('created_at <= ?', time_local.end_of_month) .count count = count + 1 count = count.to_s # manage_idの値を定義 (各変数の値を結合) manage_id = category + yyyymm + "_" + format("%03d", count) # manage_idの値を@itemに格納 @item.manage_id = manage_id # データを保存 #@itemの値にデータが存在する場合、DBに保存 if @item.save #flashメッセージに利用するメッセージを定義 @notice_message = "データ登録成功" #flashオブジェクトにメッセージが格納されている変数を格納 ※redirect先で表示される flash[:notice] = @notice_message #トップページに遷移する。(items_pathはrake routesコマンドで確認する) redirect_to items_path else @notice_message = "データ登録失敗" flash[:notice] = @notice_message render 'new' end
【参考サイト】
・管理ID生成
https://www.lanches.co.jp/blog/2331
https://qiita.com/operandoOS/items/f932ecac5a7e9cc9f098
http://eienshinjin.hatenablog.com/entry/2014/11/05/105608
https://techacademy.jp/magazine/17950
https://www.softel.co.jp/blogs/tech/archives/3267
・flashメッセージ
http://ruby-rails.hatenadiary.com/entry/20141127/1417086075
※環境情報
OS:Centos6.9
フレームワーク : Rails 4.2.9
Web:apache 2.2
DB : MySQL 5.6
ruby:2.3.7