你在这里做的每件事都是从内存中完成的(没有任何东西存储在数据库中)。
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)
事实上,而不是删除相关的记录,我想删除操作失败和闪烁的原因:“无法删除的部分,因为它正在被一个或多个组件使用。“ – 2012-04-10 21:05:32