在我的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不支持删除列。有没有解决这个问题?
答案 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