How to avoid AR confusing way of handling default values for attributes w/ :null => false

How can I avoid AR confusing way of handling default values for attributes w/ :null => false?

This issue came up before, but I could not find an answer that resolves the issue, which I outline below:

First, I add a test table using migrations:

class AddTestTable < ActiveRecord::Migration   def self.up     create_table "users", :force => true do |t|       t.column "email", :string, :null => false       t.column "age", :integer, :null => false     end   end

  def self.down     drop_table "users"   end end

$ script/generate model User

$ script/console

Loading development environment.

User.new.email

=> ""

User.new.age

=> 0 I just dont understand why it defaults email to "" and age to 0 and not to nil. Nowhere did I set the default email value to "" and the default age value to 0 in my migration.

Now if I do $rake db:schema:dump here's what the generated schema looks like:

ActiveRecord::Schema.define(:version => 1) do

  create_table "users", :force => true do |t|     t.column "email", :string, :default => "", :null => false     t.column "age", :integer, :default => 0, :null => false   end

end

All of a sudden there is a :default=>"" for email and a default 0 for age

The new user would validate fine even if I set validates_presence_of :email, :age in the model file. It even gets worst if one sets a foreign key to :null => false, as it would default to 0!

Is there a way of overriding this confusing way that AR has to handle default values???

Thanx,

Edoardo "Dado" Marcora

Thank you soooo much!

Dado

Hi Dominique,

you strategy makes a lot of sense, but I tried it w/ the latest rails and it still overrides my defaults (even when set to nil) and I am still getting User.new.email to be "" and User.new.age to be 0... I don't remember AR behaving this way in the past. Any help?

Dado

Dominique Plante wrote: