我正在开发Rails应用程序,并希望更改现有列的数据类型。它目前是DateTime类型,我想将其更改为Date类型。我找到了一种方法here,但在这种情况下,该人并不担心预先存在的数据。
现在,我打算生成迁移......
rails g migration change_my_column_in_my_talbe
...并进行以下更改:
class ChangeMyColumnInMyTable < ActiveRecord::Migration
def change
change_column :my_table, :my_column, :date
end
end
我的问题是:将现有数据转换为Date类型,还是需要创建rake任务来转换所有现有DateTime值的值?
我找到了一个similar question,其中转换是从布尔到字符串,似乎对现有数据的更改是自动的。在我开始做出这个改变之前,我只是想确定一下。
我正在使用Rails版本4.2.0和MySQL版本5.6.27 Homebrew。对此问题的任何建议将不胜感激!
答案 0 :(得分:2)
change_column
将被转换为ALTER TABLE ... ALTER COLUMN
SQL语句,此时如何处理转换是由您的数据库决定的,因此完整的答案取决于您正在使用的数据库。但是,这是一个非常安全的选择,您的数据库可以毫无问题地在日期时间和日期之间进行转换。
那就是说,没有比测试它更好的方法了!
答案 1 :(得分:1)
使用change_column
方法,数据转换将由您使用的特定数据库适配器处理。例如,使用mysql
适配器,change_column
将调用ALTER TABLE tbl_name MODIFY COLUMN col_name DATE
。从DATETIME到DATE的数据转换将截断时间。
此外,MYSQL DATETIME到DATE执行舍入,转换为DATE值需要考虑小数秒并且将时间四舍五入,&#39; 1999-12-31 23:59:59.499&#39;变成&#39; 1999-12-31&#39;,而&#39; 1999-12-31 23:59:59.500&#39;成为&#39; 2000-01-01&#39;。无论哪种方式,change
方法对change_column
方法都不可逆。
http://guides.rubyonrails.org/active_record_migrations.html#using-the-change-method
如果您打算撤消此迁移,请改用reversible
方法。