現在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
コマンドを繰り返しながらカラム名を確認しています。
もしかしたら自分の記述が抜けている場所があるかもしれません。
###前準備
ネット上のサイトを参考にしながら設定をしました。
ruby
1 #application.rb 2 # テーブル名の設定を単数系にする 3 config.active_record.pluralize_table_names = false
- app/config/initializersフォルダの直下にファイル
aaa.erb
を作成
本題のソースコード(timestampのカラムを上書きする)
1パターン目. 以下のコードを記述
参考サイト
timestampのカラムを上書きする
このサイトの 全コード
をそのままコピペ
ruby
1#app/config/initializers/aaa.erb 2module TimestampPatch 3 module TableDefinition 4 def timestamps(*args) 5 options = args.extract_options! 6 7 options[:null] = false if options[:null].nil? 8 9 column(:ar_created_at, :datetime, options) 10 column(:ar_updated_at, :datetime, options) 11 end 12 end 13 14 module SchemaStatements 15 def add_timestamps(table_name, options = {}) 16 options[:null] = false if options[:null].nil? 17 18 add_column table_name, :ar_created_at, :datetime, options 19 add_column table_name, :ar_updated_at, :datetime, options 20 end 21 22 def remove_timestamps(table_name, options = {}) 23 remove_column table_name, :ar_updated_at 24 remove_column table_name, :ar_created_at 25 end 26 end 27 28 module Timestamp 29 def timestamp_attributes_for_update 30 [:ar_updated_at] 31 end 32 33 def timestamp_attributes_for_create 34 [:ar_created_at] 35 end 36 end 37end 38#↓この5行は何かわからない(場所ないしクラスの継承を表している?) 39ActiveRecord::ConnectionAdapters::TableDefinition.prepend TimestampPatch::TableDefinition 40ActiveRecord::ConnectionAdapters::SchemaStatements.prepend TimestampPatch::SchemaStatements 41ActiveRecord::Base.prepend TimestampPatch::Timestamp
2パターン目. 以下のコードを記述(そのままコピペ)
参考サイト
ActiveRecordで命名規則に合わないカラムを設定する方法
このサイトの 全てのモデルに対して適用
をそのままコピペ
ruby
1#app/config/initializers/aaa.erb 2module ActiveRecord 3 module Timestamp 4 def timestamp_attributes_for_update 5 [:updated_at, :updated_on, :updated] 6 end 7 8 def timestamp_attributes_for_create 9 [:created_at, :created_on, :created] 10 end 11 end 12end
あなたの回答
tips
プレビュー