在之前的《Ruby on Rails,使用new和create创建ActiveRecord对象及他们之间的区别》中学习到,通过new和create命令创建及持久化ActiveRecord对象;《Ruby on Rails,使用save和update_attributes更新持久化的ActiveRecord对象》中,我们知道通过save和update命令更新一个已经持久化过的ActiveRecord对象。
在这里,我们看看如何将已经持久化过的对象从数据库中删除。
启动rails console,先创建一个持久化对象,它的id属性是“1”。
irb(main):033:0* subject.name="abbuggy" => "abbuggy" irb(main):034:0> subject.save => true irb(main):035:0> subject.id => 1
下面准备将其删除,先从数据库中用find方法找到这个对象并赋值给一个变量。然后调用destory方法,将这个对象所包含的信息从数据库中删除。
irb(main):045:0> subject_to_delete=Subject.find(1) irb(main):061:0> subject_to_destory.destroy [1m[36m (0.0ms)[0m [1mBEGIN[0m [1m[35mSQL (1.0ms)[0m DELETE FROM `subjects` WHERE `subjects`.`id` = 1 [1m[36m (26.0ms)[0m [1mCOMMIT[0m => #<Subject id: 1, created_at: "2012-10-19 15:05:27", updated_at: "2012-10-19 15:05:27", name: nil, position: nil>
在这个对象被destory之后,即使在数据库中没有了,我们依然能够通过变量名访问它。但是通过调用frozen?方法查看,得知在这个时候,对象的属性是无法修改的。即,destory方法调用之后会将对象置为冻结状态。
irb(main):064:0> subject_to_delete.frozen? => true
我们删除这个对象的时候为什么没有使用更常见的delete而是用了destory方法呢?其实delete方法也能将对象从数据库中删除,只是delete绕过了一些Active Record的回调(callback)和验证函数;而使用destory则不会,通常我们使用destory方法来确保我们的数据库是一致的,并且不会破坏Model中所包含的业务逻辑。