【发布时间】:2017-11-17 09:37:13
【问题描述】:
在我的 Rails 应用程序中,我有一个名为 Rutinas 的模型。一段时间后,我需要向表中添加一些列,因此我生成了迁移20171116094810_add_votos_y_veces_asignada_to_rutinas.rb:
class AddVotosYVecesAsignadaToRutinas < ActiveRecord::Migration[5.1]
def change
add_column :rutinas, :votos_pos, :integer, :default => 0
add_column :rutinas, :votos_neg, :integer, :default => 0
add_column :rutinas, :veces_asig, :integer, :default => 0
end
end
在其他一些迁移之后,我需要删除两个不再需要的列 votos_pos 和 votos_neg 所以我生成了另一个迁移 20171117092026_remove_votos_from_rutinas.rb:
class RemoveVotosFromRutinas < ActiveRecord::Migration[5.1]
def change
remove_column :rutinas, :votos_pos, :integer
remove_column :rutinas, :votos_neg, :integer
end
end
问题是当我运行rails db:migrate 来迁移最后一次迁移时,它会抛出一些奇怪的错误:
== 20171117092026 RemoveVotosFromRutinas: migrating ===========================
-- remove_column(:rutinas, :votos_pos)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "rutinas"
C:/Users/pepe/Dropbox/pepe/KeepMeFit/KeepMeFit-git/db/migrate/20171117092026_remove_votos_from_rutinas.rb:3:in `change'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Caused by:
ActiveRecord::InvalidForeignKey: SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "rutinas"
C:/Users/pepe/Dropbox/pepe/KeepMeFit/KeepMeFit-git/db/migrate/20171117092026_remove_votos_from_rutinas.rb:3:in `change'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Caused by:
SQLite3::ConstraintException: FOREIGN KEY constraint failed
C:/Users/pepe/Dropbox/pepe/KeepMeFit/KeepMeFit-git/db/migrate/20171117092026_remove_votos_from_rutinas.rb:3:in `change'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
我的 Rutinas 模型如下:
class Rutina < ActiveRecord::Base
validates_presence_of :nombre
belongs_to :user
has_many :repeticions
has_many :entrenos, dependent: :destroy
has_many :votos
has_many :days, dependent: :destroy
def get_array_dias
(1..self.repeticions.last.dia).to_a
end
def get_number_of_days
days.count
end
end
User、repeticion、entreno、voto 和 day 是与我要删除的列无关的其他表。也就是说,这些列不是外键,任何外键都引用了这些列。
【问题讨论】:
-
您能简要介绍一下您的 Rutinas 模型吗?您的 Rutinas 模型可能与另一个模型相关联。
-
可能另一个模型在
Rutinas模型上有外键。之前删除关联模型中的外键列。 -
你能去
rails db并粘贴命令\d rutinas的输出吗?
标签: ruby-on-rails ruby rails-migrations