🖥

#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
https://qiita.com/ykawakami/items/2449a24e3b82ff0cbab6

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2881

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-12-29

Discussion