ChrisWesAllen
ChrisWesAllen

Reputation: 4975

ruby/rails - Converting Entire Database Field (from string to date)

I have made a huge mistake.

Initially I created my model with a field called start_date and made it a string to keep track of event dates.

Now I'm realizing it would be nice to have this field as a date type so I could do calculations like find events where start_date is between today and 1 month from now.

This issue is I already have 500 records so starting over would suck....

The format of the start_date field is in a rails compatible type " 2011-02-21 22:00:00 " but its just a string...

Is there anything I can do?

Upvotes: 0

Views: 765

Answers (3)

Syed Aslam
Syed Aslam

Reputation: 8807

Perhaps, you can do away with the risk of changing column type if there is live data. The parse methods can save you. From Ruby-doc:

parse(str='-4712-01-01', comp=true, sg=ITALY) 
Create a new Date object by parsing from a String, without specifying the format.

str is a String holding a date representation. comp specifies whether to interpret 2-digit years as 19XX (>= 69) or 20XX (< 69); the default is not to. The method will attempt to parse a date from the String using various heuristics; see _parse in date/format.rb for more details. If parsing fails, an ArgumentError will be raised. 

Here and here are some more examples / explanations. Hope this helps.

Upvotes: 0

Rabbott
Rabbott

Reputation: 4332

You could try just doing an EXPORT on the table (making sure to only export data, do not include CREATE and/or DROP table commands).

Create a migration to change the datatype

TRUNCATE the table

IMPORT the data

Since the column is now a date field, it should parse the input of a string just fine, considering that's what you provide it anyway

Upvotes: 1

Julio Santos
Julio Santos

Reputation: 3895

  1. Create a migration to add a start_date_2 column of the type you want
  2. Model.find(:all).each { |i| i.update_attributes(:start_date_2, Date.new(i.start_date)) }
  3. Create a migration to delete start_date and to rename start_date_2 to start_date

This should work, out of the top of my head.

Upvotes: 4

Related Questions