在Rails中:受数据类型影响的现有数据如何变化?

时间:2016-03-02 22:33:04

标签: ruby-on-rails database ruby-on-rails-4 type-conversion

我正在开发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。对此问题的任何建议将不胜感激!

2 个答案:

答案 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方法。