Ruby on Rails,使用destroy方法删除ActiveRecord对象

在之前的《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中所包含的业务逻辑。

posted on 2012-10-20 10:50  边晓宇  阅读(1339)  评论(0编辑  收藏  举报