我想销毁以下模型:
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
吗?
以及如何确保一切都干净?我还该怎么办?
答案 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