Defaulting datetime in migrations

I have the following in a migration:

   create_table :orders do |t|       t.references :cart       t.references :user       t.float :item_total, :default => 0.0, :null => false       t.float :discount, :default => 0.0, :null => false       t.float :tax, :default => 0.0, :null => false       t.string :shipping_type       t.float :shipping_cost, :default => 0.0, :null => false       t.float :total, :default => 0.0, :null => false       t.string :tracking       t.datetime :placed_at, :default => '0000-00-00 00:00:00', :null => false       t.datetime :shipped_at, :default => '0000-00-00 00:00:00', :null => false

      t.timestamps     end

But when I look at scheme.rb I see:

  create_table "orders", :force => true do |t|     t.integer "cart_id"     t.integer "user_id"     t.float "item_total", :default => 0.0, :null => false     t.float "discount", :default => 0.0, :null => false     t.float "tax", :default => 0.0, :null => false     t.string "shipping_type"     t.float "shipping_cost", :default => 0.0, :null => false     t.float "total", :default => 0.0, :null => false     t.string "tracking"     t.datetime "placed_at", :null => false     t.datetime "shipped_at", :null => false     t.datetime "created_at"     t.datetime "updated_at"   end

As you can see, the "default" value did not take. Yet it did for the floats that default to 0.0

When I try to save an object of class order I get errors saying the placed_at and shipped_at can not be null. (Which makes sense giving what I've pasted above).

How can I make those two fields default to "0000-00-00 00:00:00"?

Thanks, Greg

The migration might not do it as the migration supports all base databases (mysql, postgres and sqlite3). Mysql and Postgres both can take defaults on a date/time type column, I am not sure on sqlite3, that could be the problem.

If you must do this, then you can just do some sql in the migration:

sql = “SOME SQL STATEMENT TO SET THE DEFAULT YOU WANT”

execute(sql)

You can look at http://dev.mysql.com/doc/refman/5.0/en/timestamp.html for mysql or http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html for postgres.

Mikel

several possible problems here:

not sure, but maybe you would need to provide a DateTime object instead of a string.

But however, 0000-00-00 isn't a valid date anyway, since there is neither a month 0 nor such a day. It should be 0000-01-01

Well, nothing I've tried has worked as far as the migration goes. So now I'm trying in the model. I have:

class Order < ActiveRecord::Base

  before_validation_on_create :assign_dates

  validates_presence_of :placed_at   validates_presence_of :shipped_at

  private

  def assign_dates     self.placed_at = '0000-00-00 00:00:00'     self.shipped_at = '0000-00-00 00:00:00'   end

end

But when I do a create! action I get: "Validation failed: Shipped at can't be blank, Placed at can't be blank"

Why aren't those two values being set before validation occurs?

Greg

Why aren't those two values being set before validation occurs?

as mentioneb above: 0000-00-00 isn't a valid date in any case

Rails may try to convert this string into a DateTime object with DateTime.parse or something on that line and that will fail for 0000-00-00.

Ok, setting the date to a valid date "2000-01-01 00:00:00" in the "assign_dates" method worked. I guess I'm just so used to dealing with MyPHPAdmin when using PHP - it's defaults date, datetime and time fields to all zeros and seems to just always treat them as strings.

Thanks! Greg