22314


  * [ActiveRecordのdestroyメソッドの挙動について調べてみた | task blog](http://task-blog.net/2015/03/31/how-action-destroy-of-rails-method/)
  * [第6章 ユーザーのモデルを作成する | Rails チュートリアル](http://railstutorial.jp/chapters/modeling-users?version=4.0#sec-database_migrations)

> 奇妙なことに、destroyはcreateと同じようにそのオブジェクト自身を返します

上記以外に返り値について言及しているところを見つけるところができませんでした。  
削除成功の場合と失敗の場合での返り値の仕様が知りたいです。


CC BY-SA 3.0
2016-02-19T10:03:31.233
22268
2016-02-20T12:01:27.170
9008
question
ruby-on-rails rails-activerecord
RailsのActiveRecordのdeleteとdestroyの返り値の仕様が知りたい


Rails4以降であれば、destroy!を使うことで例外を発生させることができるようです。

参考：<http://blog.remarkablelabs.com/2012/12/what-s-new-in-active-record-
rails-4-countdown-to-2013>


CC BY-SA 3.0
2016-02-19T12:58:33.433
22277
2016-02-19T12:58:33.433
7900
22268
answer


destory の返り値は、参考URLにあるとおり、基本的に freeze された object ですね。  
但し、before_destroy が失敗したときのみ、false。

<https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L173-L187>

[code]

    # There's a series of callbacks associated with #destroy. If the
    # <tt>before_destroy</tt> callback throws +:abort+ the action is cancelled
    # and #destroy returns +false+.
    # See ActiveRecord::Callbacks for further details.
    def destroy
      raise ReadOnlyRecord, "#{self.class} is marked as readonly" if readonly?
      destroy_associations
      self.class.connection.add_transaction_record(self)
      destroy_row if persisted?
      @destroyed = true
      freeze
    end
    
[/code]

一方で、delete は何がどうなっても、freeze された object を返すようです。  
<https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L167-L171>

[code]

    def delete
      self.class.delete(id) if persisted?
      @destroyed = true
      freeze
    end
    
[/code]


CC BY-SA 3.0
2016-02-20T12:01:27.170
22314
2016-02-20T12:01:27.170
7471
22268
answer