How to avoid AR confusing way of handling default values for

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

Dear Dado:

Here is the migration script you might be looking for! I created a new
app, created a user model, used the following migration, did the rake
migrate, then when I typed User.new.email, I got a nil instead of the “”
you were getting.

class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.column “email”, :string, :null => false, :default => nil
t.column “age”, :integer, :null => false, :default => nil
end
end

def self.down
drop_table :users
end
end

I guess there are some people that think nil is a reasonable starting
value, and others that believe the default should be initialized to a
value within the range of allowable inputs… I guess there will always
be needs to do it either way…

Hope this helps!

Dominique

Dado wrote:

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

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