Reputation: 195
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:
Do you have any idea what might cause the problem and how we can change the default generation back to NOT NULL?
Upvotes: 11
Views: 10321
Reputation: 1125
This issue infuriated me because I had an old app that had been on Rails 3.2 for a couple years, with a large number of usages of this method, hence this initializer:
# Force t.timestamps to always be null: false
module ActiveRecord
module ConnectionAdapters
class TableDefinition
def timestamps_with_non_nullable(*args)
options = args.extract_options!
options.merge!(null: false)
timestamps_without_non_nullable(*args, options)
end
alias_method_chain :timestamps, :non_nullable
end
end
end
Upvotes: 0
Reputation: 434655
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.
Upvotes: 8