48 lines
1.7 KiB
Markdown
48 lines
1.7 KiB
Markdown
|
---
|
||
|
title: "ActiveRecord: Skipping callbacks like after_save or after_update"
|
||
|
kind: article
|
||
|
slug: activerecord-skipping-callbacks-like-after_save-or-after_update
|
||
|
created_at: 2009-06-07
|
||
|
tags:
|
||
|
- General
|
||
|
---
|
||
|
|
||
|
Active Records provides callbacks, which is great is you want to perform extra business logic after (or before) saving, creating or destroying an instance of that model.
|
||
|
|
||
|
However, there are situations where you can easily fall into the trap of creating an infinite loop.
|
||
|
|
||
|
<pre lang="ruby">class Beer < ActiveRecord::Base
|
||
|
def after_save
|
||
|
x = some_magic_method(self)
|
||
|
update_attribute(:my_attribute, x)
|
||
|
end
|
||
|
end</pre>
|
||
|
|
||
|
The above will give you a nice infinite loop (which doesn't scale). It's possible to update your model, without calling the callbacks and without resorting to SQL.
|
||
|
|
||
|
<pre lang="ruby">class Beer < ActiveRecord::Base
|
||
|
def after_save
|
||
|
x = some_magic_method(self)
|
||
|
Beer.update_all("my_attribute = #{x}", { :id => self.id })
|
||
|
end
|
||
|
end</pre>
|
||
|
|
||
|
This is a bit unconventional, but it works nicely. You can use all the following ActiveRecord methods to update your model without calling callbacks:
|
||
|
|
||
|
<ul>
|
||
|
<li>decrement</li>
|
||
|
<li>decrement_counter</li>
|
||
|
<li>delete</li>
|
||
|
<li>delete_all</li>
|
||
|
<li>find_by_sql</li>
|
||
|
<li>increment</li>
|
||
|
<li>increment_counter</li>
|
||
|
<li>toggle</li>
|
||
|
<li>update_all</li>
|
||
|
<li>update_counters</li>
|
||
|
</ul>
|
||
|
|
||
|
<em>An important warning: These methods don't do all the nice SQL injection protection stuff you're used to. In the example, the value of <code>x</code> will be inserted straight into the SQL. I recommend you only use these methods if you're absolutely sure you've cleaned the values you're inserting.</em>
|
||
|
|
||
|
Check out the rails documentation on how to use these methods.
|