0

我想销毁以下模型:

class Job < ActiveRecord::Base
  has_many :items
  validates :name, presence: true, uniqueness: true
end

这是项目模型

class Item < ActiveRecord::Base
  belongs_to :department
  belongs_to :job
  belongs_to :category
  validates :name, presence: true, uniqueness: true
end

我知道我会用rails d model Job

但是如何删除模型job_id中的列Item?是db:rollback吗?以及如何确保一切都是干净的?我还应该做什么?

4

4 回答 4

2

我们无法从提供的信息中判断您是否可以简单地运行向下迁移来删除该job_id列,因为它可能会破坏其他列。但是,您可以创建一个显式删除该job_id列的新迁移:

# from command line
rails g migration RemoveJobIdFromItems

指定要在表中删除的列:

def up
  remove_column :items, :job_id
end

如果您想重新添加迁移,请创建一个向下迁移来回滚删除:

def down
  add_column :items, :job_id, :integer
end

然后从命令行运行rake db:migrate。该列将从items表中删除。

最后,您需要确保已从模型中删除关联:

# app/models/item.rb
class Item < ActiveRecord::Base
  belongs_to :department
  belongs_to :category
  validates :name, presence: true, uniqueness: true
end
于 2013-08-30T22:04:36.663 回答
0

如果只有您并且您可以在没有 Item 表中的数据的情况下生活,那么:

  • 运行rake db:rollback两次以删除 Job 和 Item 表
  • 运行rails d model Job以删除作业模型和迁移
  • 编辑项目迁移文件以手动删除该belongs_to :job
  • 最后rake db:migrate让事情恢复正常

与组一起工作时,您不知道他们是否已经运行了添加 job_id 的迁移,因此这样更安全:

  • 运行rails g migration remove_job_id_from_items job_id:integer以创建从 Item 表中删除 job_id 的迁移
  • 运行rails g migration drop_items_table以删除表并编辑此迁移以添加drop_table :job到更改块(请参阅下面的注释)
  • 运行rake db:migrate以将您刚刚创建的这两个迁移向前推进。
  • 最后运行rails d model Job --skip-migration破坏模型但离开原来的迁移

当您这样做时,两个迁移都将永远保留在您的项目中,但会相互抵消。在 git 中,我们只尝试前进。

(注意:这可能会产生“不可逆转的迁移”,并且可能有更好的方法来执行此步骤。)

于 2013-08-30T22:31:07.737 回答
0

假设您还在 job_id 列上放置了一个索引,您将希望在删除该列之前删除它。此外,如果您正在运行 rails 3.1+,您可以跳过 up/down 方法,而只需在像这样简单的事情上使用 change 方法,否则我会完全同意 zeantsoi。对于您的迁移:

def change
  remove_index :items, :job_id
  remove_column :items, :job_id
end

此外,如果您的列没有索引:索引您的外键。

于 2013-08-30T22:54:49.663 回答
0

您可以生成将删除索引 job_id 的迁移。无需手动修改迁移文件。简单地:

rails g migration RemoveJobRefFromItems job:references
于 2014-12-18T16:52:06.970 回答