0
class Assembly < ActiveRecord::Base 
    has_and_belongs_to_many :parts 
end 

class Part < ActiveRecord::Base 
    has_and_belongs_to_many :assemblies 
end 

在控制台:如何防止has_and_belongs_to_many删除选项删除正在Rails中使用的记录?

part1 = Part.new 
assembly1 = Assembly.new 
assembly1.parts << part1 
part1.delete 
Parts.all 
=> [] 

检查assembly1.parts表明,仍然是有关系的

这怎么可能当记录已被删除。(!)?

另外,如何防止删除与组件相关的零件?

使用Rails 3.0.7。

回答

2

你在这里做的每件事都是从内存中完成的(没有任何东西存储在数据库中)。

ActiveRecord delete方法将从数据库中删除一个对象,但它不查找可能已经引用该对象的内存中的其他对象。我想如果你做了assembly1.parts.delete(part1)这可能会做你期望的。

如果你已经保存了对象的数据库:这里怎么即使它在数据库part1.delete不一定会从你的装配对象删除

part1 = Part.create 
assembly1 = Assembly.create(:parts => [part1]) 
assembly1.parts 
# => [part1] 
part1.delete 
assembly1.parts 
# => [part1] 
assembly1.reload 
assembly1.parts 
# => [] 

注意,直到刷新内存中的集合或使用我提到的方法将其删除早期assembly1.parts.delete(part1)

UPDATE

我想你通常不应使用delete()方法。你应该几乎总是使用destroy()delete()只会触发对数据库的删除并忽略所有回调,并且我相信:dependent => :destroy式样的声明在您的模型中。如果您使用的destroy()方法,那么你可以在模型声明before_destroy回调:

class MyClass 
    has_and_belongs_to_many :foos 

    before_destroy :allow_destroy 

    def allow_destroy 
    foos.empty? 
    end 
end 

这应该让你不破坏它,如果它是一个组件的一部分的需求。你不能停止执行delete()因为它忽略了回调:ActiveRecord::Relation#delete documentation

更多信息有关model callbacks (documentation)

0

您需要将:dependent => :destroy添加到控制器。

+0

事实上,而不是删除相关的记录,我想删除操作失败和闪烁的原因:“无法删除的部分,因为它正在被一个或多个组件使用。“ – 2012-04-10 21:05:32