質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Ruby on Rails 4

    2382questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

railsで管理IDの実装方法について

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 74

koichi8888

score 11

 前提・実現したいこと

railsの管理IDを下記の規則で生成し、実装する方法についての質問です。
別の質問(https://teratail.com/questions/130727)でIDを生成するSQL文に関しては把握できたのですが、これをコントローラ等にどうように記述するか分からず、質問しました。

管理IDを割り当てるタイミングについては下記の2パターンがあると思っております。

パターン1:
・既存で登録しているデータに対してIDをふり直す
※現状、適当に数値を割り当てています。

パターン2:
・新規登録する際に管理IDを割り当てる
⇒イメージとしては登録時のparamsのデータを参照し、管理IDを生成する。

参考になるサイト等、何かご存知でしたら、教えて頂けると幸いです。

命名規則
<category_id> + <created_atのyyyy/mm> + <各月ごとのシーケンス番号>

モデル名:GyomuDatum

ID manage_id data category_id created_at
1 A201804_001 hoge A 2018-04-01
1 A201804_002 hoge A 2018-04-01
2 B201805_001 huga B 2018-05-01
2 B201805_002 huga B 2018-05-01

 該当のソースコード

items_controller.rb

class ItemsController < ApplicationController

     before_action :authenticate_user


  def index

# データ検索

pp "############データ検索開始############"

      if params[:manage_id].present?
        items = GyomuDatum.where('manage_id LIKE ?', "%#{params[:manage_id]}%")
      elsif params[:category_id].present?
        items = GyomuDatum.where('category_id LIKE ?', "%#{params[:category_id]}%")
      elsif params[:publish_corporation].present?
        items = GyomuDatum.where('publish_corporation LIKE ?', "%#{params[:publish_corporation]}%")
      elsif params[:ip_address].present?
        items = GyomuDatum.where('ip_address LIKE ?', "%#{params[:ip_address]}%")
      elsif params[:target_server].present?
        items = GyomuDatum.where('target_server LIKE ?', "%#{params[:target_server]}%")
      elsif params[:start_date].present?
        items = GyomuDatum.where('start_date LIKE ?', "%#{params[:start_date]}%")
      elsif params[:end_date].present?
        items = GyomuDatum.where('end_date LIKE ?', "%#{params[:end_date]}%")
      elsif params[:comment].present?
        items = GyomuDatum.where('comment LIKE ?', "%#{params[:comment]}%")

      else
        items = GyomuDatum.all.order(created_at: 'desc')

      end




pp "############データ検索終了############"

    # ページネーション
    @items = items.page(params[:page]).per(20)

    # 期限が迫っているデータを検索する

    # 1ヶ月前
    from  = Time.now.at_beginning_of_day
    to    = (from + 1.month)
    @items_1month = GyomuDatum.where(end_date: from...to)

  end

  def show
  end

  def new
    @item = GyomuDatum.new
  end

  def create

    # 変数定義

    @item = GyomuDatum.new(item_params)
    manage_id = @item.manage_id
    category_id = @item.category_id


    # 現在の時刻取得
    require "date"
    time = DateTime.now

    # 操作履歴登録
    histories = HistoriesDatum.new({manage_id: manage_id, category_id: category_id, type_id: '1', user_id: session[:user_id], user_name: session[:user_name], created_at: time, updated_at: time, deleted_at: ""})
    histories.save


    # データ登録判定

    if @item.save
      @notice_message = "データ登録成功"
      flash[:notice] = @notice_message
      redirect_to items_path
    else
      @notice_message = "データ登録失敗"
      flash[:notice] = @notice_message
      render 'new'
    end
  end


  def edit
    @item = GyomuDatum.find(params[:id])
  end

  def update

  # データ更新処理

    # 変数定義
    @item = GyomuDatum.find(params[:id])
    manage_id = @item.manage_id
    category_id = @item.category_id

    # 現在の時刻取得
    require "date"
    time = DateTime.now

    # 操作履歴登録
    histories = HistoriesDatum.new({manage_id: manage_id, category_id: category_id, type_id: '2', user_id: session[:user_id], user_name: session[:user_name], created_at: time, updated_at: time, deleted_at: ""})
    histories.save

   # データ編集処理判定
    if @item.update(item_params)
      @notice_message = "データ編集成功"
      flash[:notice] = @notice_message
      redirect_to items_path
    else
      @notice_message = "データ編集失敗"
      flash[:notice] = @notice_message
      render 'edit'
    end
  end

  def destroy

  # データ削除処理

    # 変数定義
    @item = GyomuDatum.find(params[:id])
    manage_id = @item.manage_id
    category_id = @item.category_id

    # category_idの値を整数にする
    if category_id == "SSL"
        category_id = 1
    elsif category_id == "ドメイン"
        category_id = 2
    end

    # 現在の時刻取得
    require "date"
    time = DateTime.now

    # 操作履歴登録
    histories = HistoriesDatum.new({manage_id: manage_id, category_id: category_id, type_id: '3', user_id: session[:user_id], user_name: session[:user_name], created_at: time, updated_at: time, deleted_at: ""})
    histories.save

    # 削除処理
    @item = GyomuDatum.find(params[:id])
    @item.destroy
    redirect_to items_path
  end


  # cron用メール送信メソッド
  def mail_notice

    # メール送信実行
    SampleMailer.send_when_limit.deliver

  end

    # プライベートメソッド
    private
    def item_params
      permits = [
        :manage_id,
        :category_id,
        :publish_corporation,
        :ip_address,
        :target_server,
        :start_date,
        :end_date, 
        :comment
      ]
      params.require(:gyomu_datum).permit(permits)
    end

# class範囲終了
end

index.html.erb

<main>
<!-- ↓↓ログインメッセージ、データ登録、編集成功表示↓↓ -->

        <% if flash[:notice] %>
          <div class="alert alert-success">
            <%= flash[:notice] %>
            </div>
        <% end %>

<!-- ↑↑ログインメッセージ、データ登録、編集成功表示↑↑ -->


<br>
<br>
<br>
<p class="rei1">通知</p>
<br>
<br>

<% @items_1month.each do |item| %>
  <ul>
    <li>
      管理ID <%= item.manage_id %> は期限切れまであとXX日です。有効期限の終了日は <%= item.end_date %> です。
    </li>
  </ul>
<% end %>


<br>
<p class="rei1">データ検索</p>

<div class="search_forms">
<br>
<%= form_tag('/items', method: 'get') do %>
  <%= label_tag(:manage_id, '管理ID') %>
  <%= text_field_tag(:manage_id) %>

<% if false %>
  <%= label_tag(:category_id, 'カテゴリ') %>
  <%= text_field_tag(:category_id) %>
<% end %>

  <%= label_tag(:category_id, 'カテゴリ') %>
  <%= select_tag 'category_id', options_for_select(["1", "2"]) %>


  <%= label_tag(:publish_corporation, '発行会社') %>
  <%= text_field_tag(:publish_corporation) %>

  <%= label_tag(:ip_address, 'IPアドレス') %>
  <%= text_field_tag(:ip_address) %>  
<br>
<br>

  <%= label_tag(:target_server, '対象サーバ') %>
  <%= text_field_tag(:target_server) %>  

  <%= label_tag(:start_date, '有効期限の開始日') %>
  <%= text_field_tag(:start_date) %>  

  <%= label_tag(:end_date, '有効期限の終了日') %>
  <%= text_field_tag(:end_date) %>  
<br>
<br>
  <%= label_tag(:comment, 'コメント') %>
  <%= text_field_tag(:comment) %>

  <%= submit_tag "検索", class: "form_button" %> <%= link_to 'クリア', items_path %>
<% end %>
</div>


<br>
<p class="rei1">データ一覧</p>
<br>

<!-- 権限によってデータ一覧の項目値を変更 -->

<section>

<!-- 追加箇所開始 -->
<% if false %>
<%= page_entries_info @items %>
<% end %>
<!-- 追加箇所終了 -->


  <table class="type06">
    <thead>

      <% if session[:authority] == "Admin" %>

     <tr>
      <th>管理ID</th>
      <th>カテゴリ</th>
      <th>発行会社</th>
      <th>IPアドレス</th>
      <th>対象サーバ</th>
      <th>有効期限の開始日</th>
      <th>有効期限の終了日</th>
      <th>コメント</th>
      <th>操作</th>
     </tr>

  </thead>
  <tbody>

    <% @items.each do |item| %>
     <tr>
      <td><%= item.manage_id %></td>
      <td><%= item.category.name %></td>
      <td><%= item.publish_corporation %></td>
      <td><%= item.ip_address %></td>
      <td><%= item.target_server %></td>
      <td><%= item.start_date %></td>
      <td><%= item.end_date %></td>
      <td><%= item.comment %></td>
      <td>
      <%= link_to '[Edit]', edit_item_path(item), class: 'command' %>
      <%= link_to '[Delete]', 
      item_path(item), 
      method: :delete,
      class: 'command',
      data: { confirm: 'データ削除しますか?' } %>
      </td>
     </tr>

    <% end %>


    <% elsif session[:authority] == "Operator" %>

     <tr>
      <th>管理ID</th>
      <th>カテゴリ</th>
      <th>発行会社</th>
      <th>IPアドレス</th>
      <th>対象サーバ</th>
      <th>有効期限の開始日</th>
      <th>有効期限の終了日</th>
      <th>コメント</th>
     </tr>

      <% @items.each do |item| %>
     <tr>
      <td><%= item.manage_id %></td>
      <td><%= item.category.name %></td>
      <td><%= item.publish_corporation %></td>
      <td><%= item.ip_address %></td>
      <td><%= item.target_server %></td>
      <td><%= item.start_date %></td>
      <td><%= item.end_date %></td>
      <td><%= item.comment %></td>
     </tr>

    <% end %>

    <% else %>

      <!-- データ一覧を表示しない -->

    <% end %>

    </tbody>
  </table>


<!-- 追加箇所開始 -->

<%= paginate @items %>

<!-- 追加箇所終了 -->

</section>

<br>
<%= link_to "CSV出力", items_path(format: :csv), class: "btn btn-primary" %>



<% if false %>
    <% @items.each do |item| %>
        <%= item.category.name %>
    <% end %>
<% end %>

<% if false %>

    <%= @items.each do |item| %>
        <%= item.manage_id %>

        <% item.category.each do |p| %>
            <%= p.id %>
            <%= p.name %>
        <% end %>

    <% end %>

<% end %>


</main>

 試したこと

分かっていることはGyomuDatum.find_by_sqlという記述でコントローラ内でSQL文を実行できることです。

 補足情報(FW/ツールのバージョンなど)

・Rails
Rails 4.2.10

・Mysql
mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails 4

    2382questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。