Rails删除没有数据类型的列

时间:2016-10-11 11:41:42

标签: ruby-on-rails sqlite

在我的Rails 5应用程序中,我意外地创建了一个没有数据类型的列。数据库是SQLite。

create_table "students", force: :cascade do |t|
 t.integer  "club_id"
 t.string   "email"
 t.datetime "created_at",      null: false
 t.datetime "updated_at",      null: false
 t.string   "picture"
 t.integer  "payment_plan_id"
 t.         "activity"
 t.index ["club_id"], name: "index_students_on_club_id"
end

当我尝试rails db:rollback时,我收到此错误:

Rhys-MacBook-Pro:classmaster Rhys$ rails db:rollback == 20161011105423 AddActivitiesRefToStudents: reverting =======================
-- remove_column(:students, :activity, :reference)
rails aborted! StandardError: An error has occurred, this and all later migrations canceled: undefined method `to_sym' for nil:NilClass

我尝试过运行此迁移:

class RemoveColumn < ActiveRecord::Migration
 def up
   execute "ALTER TABLE students DROP COLUMN activity";
 end
end  

但我认为SQLite不支持删除列。有没有解决这个问题?

3 个答案:

答案 0 :(得分:1)

我假设它是你要删除的活动列,因为它没有该文件中的类型,如果它是一个不同的列,那么只需更改下面的列名。

您要做的是从表中删除一个列,您绝对可以这样做。在命令行中执行类似下面的行(或者与下面的行完全相同)来创建要删除列的迁移。

rails g migration drop_activity_column_from_students

然后打开那个文件,里面的方法应该是这个。

def change
   remove_column :students, :activity
end

然后运行

rake db:migrate 

你应该看到从表中删除了一列。

如果您希望了解更多信息,可以找到大量有关迁移的信息here

答案 1 :(得分:0)

我遇到了同样的问题,在尝试各种迁移并运行rails db:reset但没有成功之后,我刚刚删除了schema.rb文件并运行了rails db:migrate,它从头开始重建我的架构而没有列没有数据类型。只需确保没有任何迁移包含添加“活动”列,因此您不会重复此问题。

答案 2 :(得分:0)

尝试通过以下方式更改列的类型:

  

rails g migration FixActivityTypeStudents

然后在迁移中添加此部分。

    def change
        change_column :students, : activity,  :string
    end