🖥
#Rails のマイグレーションで timestamp を指定しているのに created_at / updated_at が生成されないの
timestamp
単数形で書いてた。何これっていう。こう書くと何も起こらない模様。
timestamps
が正しい。
class CreateUser < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :name, null: true
# binding.pry
t.timestamp
end
end
end
t は MYSQL のテーブル定義クラスだ
t.class
# => ActiveRecord::ConnectionAdapters::MySQL::TableDefinition
中身は空の配列だ
t.timestamp
=> []
pry doc で違いを確認
[4] pry(#<CreateUser>)> $ t.timestamp
From: /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/schema_definitions.rb @ line 231:
Owner: ActiveRecord::ConnectionAdapters::ColumnMethods
Visibility: public
Number of lines: 3
def #{column_type}(*args, **options)
args.each { |name| column(name, :#{column_type}, options) }
end
[4] pry(#<CreateUser>)> $ t.timestamps
From: /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/schema_definitions.rb @ line 395:
Owner: ActiveRecord::ConnectionAdapters::TableDefinition
Visibility: public
Number of lines: 6
def timestamps(**options)
options[:null] = false if options[:null].nil?
column(:created_at, :datetime, options)
column(:updated_at, :datetime, options)
end
t.string
t.datetime
などと同じで、カラム名を指定して扱うものだと後から気づいた。
t.timestamp :occured_at
名前を渡さなかったらエラーにしてくれよっていう...Railsさん。
datetime VS timestamp
- t.timestamps は datetime型でカラムを作る
- t.timestamp は timestamp型でカラムを作る
- t.datetime は datetime型でカラムを作る
後から気づいたが、こんな分かりにくい状況になっているようだ。
Rails version と DB Adapter ( MySQLなど ) の組み合わせによるだろうが。
MySQLのDATETIME型とTIMESTAMP型の違いを検証してみた - Qiita
Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2019-12-29
Discussion