Search code examples
ruby-on-railspostgresqlactiverecordmigrationjruby

Rails migration generates default timestamps (created_at, updated_at) as NULLABLE


Some time ago we upgraded our application to Rails 4 and switched to JRuby.

Before that change migrations created the default timestamps as NOT NULL. After that change the NOT NULL is missing.

We create these timestamps (created_at, updated_at) as follows:

class Model < ActiveRecord::Migration
  def change
    create_table :model do |t|
      t.belongs_to :user, :null => false

      t.text :content

      t.timestamps
    end
  end
end

The important parts of our application are:

  • ruby '1.9.3', :engine => 'jruby', :engine_version => '1.7.9'
  • gem 'rails', '4.0.2'
  • gem 'activerecord-jdbcpostgresql-adapter', '1.3.4'
  • postgresql: stable 9.3.1

Do you have any idea what might cause the problem and how we can change the default generation back to NOT NULL?


Solution

  • I don't know if it is documented anywhere but the source indicates that you can pass the usual column options to t.timestamps:

    # Appends <tt>:datetime</tt> columns <tt>:created_at</tt> and
    # <tt>:updated_at</tt> to the table.
    def timestamps(*args)
      options = args.extract_options!
      column(:created_at, :datetime, options)
      column(:updated_at, :datetime, options)
    end
    

    so you can say:

    create_table :model do |t|
      #...
      t.timestamps :null => false
    end
    

    and your columns should be NOT NULL.

    If you look at the 3.2 version, you'll see what's happened:

    def timestamps(*args)
      options = { :null => false }.merge(args.extract_options!)
      #...
    end
    

    so 3.2 creates the timestamp columns as NOT NULL by default but 4.0 does not.