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

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

ただいまの
回答率

90.61%

  • Ruby on Rails 4

    2411questions

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

データベースのTimestampのカラム名が変更できない

受付中

回答 0

投稿 編集

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

begenner

score 25

現在RailsでMySQLに接続してアプリを作成していますが、今回は別言語で作られている既存のMySQLデータベースにアクセスしレコードを操作する必要があります。

そのため既存の別言語のテーブル名やカラム名に合わせるためRailsの規則には反しますが設定を試みています。
テーブル名(単数形)は問題ないのですが

timestampのカラム名(初期設定など)

を変更することができません(created_at、updated_atのまま)。

分かる方がいらっしゃれば教えていただきますようよろしくお願いいたします(m_ _m)

期待する動作

テーブルを単数形にして、テーブル作成時・レコード保存時のTimestampsのカラム名を変更したい

既存のデータベース

  • テーブル名:単数形・アンダーバーあり
  • timestamps:独自のカラム名・アンダーパーあり

動作環境

Ruby:2.3.5
Ruby on Rails: 4.2.5
MySQL: 5.7.18

試したこと

下に参考にしたサイトのソースコードをそのままコピペして試してみました
確かめ方としてはdevelopment環境のデータベースで
rake db:rollback と rake:dbmigrate コマンドを繰り返しながらカラム名を確認しています。
もしかしたら自分の記述が抜けている場所があるかもしれません。

前準備

ネット上のサイトを参考にしながら設定をしました。

    #application.rb
    # テーブル名の設定を単数系にする
    config.active_record.pluralize_table_names = false
  • app/config/initializersフォルダの直下にファイルaaa.erbを作成

 本題のソースコード(timestampのカラムを上書きする)

1パターン目. 以下のコードを記述

参考サイト
timestampのカラムを上書きする
このサイトの 全コード をそのままコピペ

#app/config/initializers/aaa.erb
module TimestampPatch
  module TableDefinition
    def timestamps(*args)
      options = args.extract_options!

      options[:null] = false if options[:null].nil?

      column(:ar_created_at, :datetime, options)
      column(:ar_updated_at, :datetime, options)
    end
  end

  module SchemaStatements
    def add_timestamps(table_name, options = {})
      options[:null] = false if options[:null].nil?

      add_column table_name, :ar_created_at, :datetime, options
      add_column table_name, :ar_updated_at, :datetime, options
    end

    def remove_timestamps(table_name, options = {})
      remove_column table_name, :ar_updated_at
      remove_column table_name, :ar_created_at
    end
  end

  module Timestamp
    def timestamp_attributes_for_update
      [:ar_updated_at]
    end

    def timestamp_attributes_for_create
      [:ar_created_at]
    end
  end
end
#↓この5行は何かわからない(場所ないしクラスの継承を表している?)
ActiveRecord::ConnectionAdapters::TableDefinition.prepend TimestampPatch::TableDefinition
ActiveRecord::ConnectionAdapters::SchemaStatements.prepend TimestampPatch::SchemaStatements
ActiveRecord::Base.prepend TimestampPatch::Timestamp

2パターン目. 以下のコードを記述(そのままコピペ)

参考サイト
ActiveRecordで命名規則に合わないカラムを設定する方法

このサイトの 全てのモデルに対して適用 をそのままコピペ

#app/config/initializers/aaa.erb
module ActiveRecord
  module Timestamp
    def timestamp_attributes_for_update
      [:updated_at, :updated_on, :updated]
    end

    def timestamp_attributes_for_create
      [:created_at, :created_on, :created]
    end
  end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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

  • Ruby on Rails 4

    2411questions

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