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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

906閲覧

Railsのcreated_atをcreatedに変更したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2017/11/30 10:39

###実現したいこと
元々CakePHPで作成していたシステムをRailsに移行しています。
テーブル内のcreated,modifiedをそのまま利用したいので、created_at,created,updated_at,modifiedすべてに対応する形でデフォルトの設定を変更したいと考えています。

###発生している問題・エラーメッセージ
以下のコードをconfig/initialiersにファイルとして保存しており、
他のサービスでは動いているのですが、今回移行先として作成したプロジェクトで動作しない理由がわかりません。

この記事を元に作ったものです。

https://qiita.com/wakaba260/items/95232b75de86cb5e852e

[set_activerecord_timestamp.rb]

lang

1module TimestampPatch 2 module TableDefinition 3 def timestamps(*args) 4 options = args.extract_options! 5 6 options[:null] = false if options[:null].nil? 7 8 column(:created_at, :datetime, options) 9 column(:updated_at, :datetime, options) 10 column(:created, :datetime, options) 11 column(:modified, :datetime, options) 12 end 13 end 14 15 module SchemaStatements 16 def add_timestamps(table_name, options = {}) 17 options[:null] = false if options[:null].nil? 18 19 add_column table_name, :created_at, :datetime, options 20 add_column table_name, :updated_at, :datetime, options 21 add_column table_name, :created, :datetime, options 22 add_column table_name, :modified, :datetime, options 23 end 24 25 def remove_timestamps(table_name, options = {}) 26 remove_column table_name, :updated_at 27 remove_column table_name, :created_at 28 remove_column table_name, :modified 29 remove_column table_name, :created 30 end 31 end 32 33 module Timestamp 34 def timestamp_attributes_for_update 35 [:updated_at, :modified] 36 end 37 def timestamp_attributes_for_create 38 [:created_at, :created] 39 end 40 end 41end 42ActiveRecord::ConnectionAdapters::TableDefinition.prepend TimestampPatch::TableDefinition 43ActiveRecord::ConnectionAdapters::SchemaStatements.prepend TimestampPatch::SchemaStatements 44ActiveRecord::Base.prepend TimestampPatch::Timestamp

Userモデル(devise利用)が以下の定義であり、

create_table "users", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC" do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.datetime "created", null: false t.datetime "modified", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end

set_activerecord_timestamp.rbをinitializersに入れた状態でUserにデータを追加します。

rails c user = User.new user.email = "aaa@example.com" user.password = "123456" user.save

そうすると以下エラーが発生します。

ActiveRecord::NotNullViolation: Mysql2::Error: Field 'created' doesn't have a default value

エラーの内容はわかるのですが、なぜcreatedに対して変更が適用されないのかの解消ができていません。
お願いします!

###補足情報(言語/FW/ツール等のバージョンなど)
Rails 5.1.4
ruby 2.4.1
gem devise 4.3.0
gem mysql2 0.4.10

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/30 11:24

ありがとうございます!認識が違っていたらすみませんが、今回の場合は別名を付けたいというよりもテーブル操作の日時デフォルトの対象として追加したいのです。
guest

回答1

0

ベストアンサー

自己解決しました。

ActiveRecordのtimestamp.rbの中身が5.0の時から変化しており、
参考にしていたサイトのパッチだと適用できない状態でした。

[v5.0.1]
https://github.com/rails/rails/blob/v5.0.1/activerecord/lib/active_record/timestamp.rb#L100-L106

[v5.1.3]
https://github.com/rails/rails/blob/5.1.3/activerecord/lib/active_record/timestamp.rb

上記の差分を参考にパッチを以下に書き換えたところ期待する動作になりました。
デフォルトからの変更はやはり良くないですね。。

module ActiveRecord module Timestamp class_methods do private def timestamp_attributes_for_create ["created_at", "created_on", "created"] end def timestamp_attributes_for_update ["updated_at", "updated_on", "modified"] end end end end

結構レアケースだと思うので参考にならないかもしれませんが記載しておきます。

投稿2017/12/11 09:01

編集2017/12/11 13:12
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問