如何更改rails中的列数据类型?

时间:2013-12-11 22:54:09

标签: ruby-on-rails ruby postgresql migration schema

我想使用Rails更改数据库中多个列的数据类型。我尝试了下面的代码,但是我收到错误“G :: DuplicateColumn:ERROR:column”地理位置“关系”town_health_records“已经存在”

我已尝试创建新的迁移文件并运行rake db:migrate,如下所示:

class UpdateColumns < ActiveRecord::Migration
  def change
    change_table :town_health_records do |t|
     t.string :geography
     t.string :total_pop_year_2005
     t.string :age_0_19_year_2005
     t.string :age_65_up_year_2005
     t.string :per_capita_income_year_2000
     t.string :persons_below_200pct_poverty_yr_2000
     t.float :pct_all_persons_below_200pct_poverty_year_2000
     t.float :pct_adequacy_prenatal_care_kotelchuck
     t.float :pct_c_sections_2005_2008
     t.integer :num_infant_deaths_2005_2008
     t.float :infant_mortality_rate_2005_2008
     t.float :pct_low_birthweight_2005_2008
     t.float :pct_multiple_births_2005_2008
     t.float :pct_publicly_financed_prenatal_care_2005_2008
     t.float :pct_teen_births_2005_2008


      t.timestamps
    end
  end
end

我只需要将以下列的数据类型更改为字符串:

:total_pop_year_2005
:age_0_19_year_2005
:age_65_up_year_2005
:per_capita_income_year_2000
:persons_below_200pct_poverty_yr_2000

3 个答案:

答案 0 :(得分:4)

尝试使用t.change代替t.string。你现在正在做的是尝试声明另一个名为geography的列,这就是你看到错误的原因。

查看change_table方法的API Documentation

因此,您的迁移文件应如下所示:

class UpdateColumns < ActiveRecord::Migration
  def change
    change_table :town_health_records do |t|
      t.change :total_pop_year_2005, :string
      t.change :age_0_19_year_2005, :string
      ...
    end
  end
end

答案 1 :(得分:2)

添加迁移:

def change
  change_column :town_health_records, :total_pop_year_2005, :string
  change_column :town_health_records, :age_0_19_year_2005, :string
  change_column :town_health_records, :age_65_up_year_2005, :string
  change_column :town_health_records, :per_capita_income_year_2000, :string
  change_column :town_health_records, :persons_below_200pct_poverty_yr_2000, :string
end

或回滚,然后再次创建表格

答案 2 :(得分:0)

如果要更改多个列,请使用change_table。另外,请务必将类名更改为更易于维护的类似ChangeTownHealthRecordsColumns:

class ChangeTownHealthRecordsColumns < ActiveRecord::Migration
  def change
    change_table :town_health_records do |t|
      change_column :town_health_records, :total_pop_year_2005, :string
      change_column :town_health_records, :age_0_19_year_2005, :string
      change_column :town_health_records, :age_65_up_year_2005, :string
      change_column :town_health_records, :per_capita_income_year_2000, :string
      change_column :town_health_records, :persons_below_200pct_poverty_yr_2000, :string
    end
  end
end

如果您对此主题感兴趣,可以在本文中阅读更多内容:https://kolosek.com/rails-change-database-column