# How to properly override ActiveRecord::Base.find

**URL:** <https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452>\
**Category:** Rails\
**Created:** [April 25, 2009, 2:33pm UTC](https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452 "2009-04-25T14:33:47Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [April 25, 2009, 2:33pm UTC](https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452/1 "2009-04-25T14:33:47Z")

</div>

Hi,

I want the find(:all) method to only return published Comments.

This works:

# Override find method to only return published comments

def self.find(\*args)  
options = args.extract\_options!  
validate\_find\_options(options)  
set\_readonly\_option!(options)

```
case args.first
when :first then find_initial(options)
when :last then find_last(options)
when :all then options[:conditions] = { :published => true };

```

find\_every(options)  
else find\_from\_ids(args, options)  
end  
end

But is not very DRY since I pasted the code from active\_record/base.rb.

Any improvements on this?

CmdJohnson

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [April 25, 2009, 2:49pm UTC](https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452/2 "2009-04-25T14:49:36Z")

</div>

Commander J. wrote:

> I want the find(:all) method to only return published Comments.

Use a named\_scope. It’s too easy like that.

–  
Phlip  
[http://flea.sourceforge.net/resume.html](http://flea.sourceforge.net/resume.html)

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [April 25, 2009, 4:19pm UTC](https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452/3 "2009-04-25T16:19:11Z")

</div>

Indeed!

named\_scope :only\_published, :conditions =\> { :published =\> true }

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [April 28, 2009, 7:20pm UTC](https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452/4 "2009-04-28T19:20:14Z")

</div>

I did use that initially, but it broke my associations. After all it was  
the  
least work to just stick with a named\_scope and double-check frontend  
controllers for not showing unpublished items.

On Sat, Apr 25, 2009 at 4:57 PM, Frederick C. \<

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [April 25, 2009, 4:58pm UTC](https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452/5 "2009-04-25T16:58:24Z")

</div>

On Apr 25, 3:18 pm, Commander J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Indeed!
> 
> named\_scope :only\_published, :conditions =\> { :published =\> true }

If you’re on 2.3 you may also be interested in the default\_scope stuff  
that was recently added.

Fred

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [June 23, 2009, 10:45am UTC](https://www.ruby-forum.com/t/how-to-properly-override-activerecord-base-find/166452/6 "2009-06-23T10:45:42Z")

</div>

Hey man,

I used something like this with great success! (so far… since I just  
used like few minutes ago, nothing broke and all test passed) In  
Rails 2.2.2

class \<\< self  
def find(\*args)  
args.first == :all ? self.with\_scope(:find =\> {:conditions =\>  
[:published =\> true]}) {super} : super  
end  
end

Do test it out if you still need to. And anyone else could comment if  
this is the right way to do it.

Cheers!  
Arzumy MD

On Apr 29, 1:19 am, Commander J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
