新人Railsエンジニアの備忘録

忘れやすい性格なので、ハマったところとか、日々学んだことをメモとして残します。他の方が参照したときに少しでも役立てれば、うれしいです。

【Rails4】管理IDを生成する実装のメモ

f:id:fairemygeneration:20181210142227j:plain:w300

データの管理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