在Rails中销毁模型

时间:2013-08-30 21:58:27

标签: ruby-on-rails activerecord

我想销毁以下模型:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果它只是你而你没有Item表中的数据,那么:

  • 运行rake db:rollback两次以删除作业和项目表
  • 运行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中,我们只是向前迈进。

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

答案 2 :(得分:0)

假设您还在job_id列上添加了索引,那么在删除列之前,您将要删除该索引。此外,如果您正在运行rails 3.1+,您可以跳过上/下方法,只需对这样简单的事情使用更改方法,否则我完全同意zeantsoi。对于您的迁移:

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

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

答案 3 :(得分:0)

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

rails g migration RemoveJobRefFromItems job:references