开发者

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

I have made a hu开发者_C百科ge 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?


  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.


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


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜