Having a default condition in model


#1

Is there a way to specify at the model level that you want all calls to
find(), find_by_xxxx(), etc, to include a certain :conditions clause?

for instance, if normally you wanted to only select articles
where “is_published = 1” (which you could of course override in admin
mode or something)

because with this flag, when you are selecting articles from different
views and/or controllers, it requires them to have knowledge of the
underlying articles model and even the DB table. Doesn’t seem very DRY.

And in fact we wanted to add another default flag, “is_active = 0”
(because deleted articles are really just flagged, not deleted). So now
having to go through the whole app…

thanks
Sam


#2

Find with scope, then alias’ the find methods. There is an example of
this in acts_as_versioned by Rick O.

Zach I.
→ Blog — http://www.zachinglis.com
→ Company — http://www.lt3media.com
→ Portfolio — http://portfolio.zachinglis.com


#3

Sam,

You’re asking two different questions actually :

Is there a way to specify at the model level that you want all
calls to
find(), find_by_xxxx(), etc, to include a certain :conditions
clause?

The plugin ScopedAccess
http://agilewebdevelopment.com/plugins/scoped_access
does just that. You may look at the code to see how it works.

for instance, if normally you wanted to only select articles
where “is_published = 1”

That’s a different case, and much easier to satisfy thanks to Rails
associations.

Ex:
class User << AR
has_many :articles
has_many :published_articles , :conditions => “is_published =
1” ,
:class_name => ‘Article’, :foreign_key =>
‘article_id’
end

Alain R.

http://blog.ravet.com


#4

Thanks for the quick response!

On Wednesday 16 May 2007, Alain R. wrote:

Sam,

You’re asking two different questions actually :

Is there a way to specify at the model level that you want all
calls to

find(), find_by_xxxx(), etc, to include a certain :conditions
clause?

The plugin ScopedAccess
http://agilewebdevelopment.com/plugins/scoped_access
does just that. You may look at the code to see how it works.

ok that looks cool - but according to a comment at the bottom of that
page “This has been incorporated into Rails” - is that true? The
homepage for it gives a 404 and there seems to be some red flags about
it in other posts… hmm. Another scary plugin?
http://www.mail-archive.com/removed_email_address@domain.invalid/msg01489.html

[another topic: Is there anything in Rails equivalent to CPAN or PEAR
where you can reasonably be sure the code is stable and high-quality?
I’ve already gone down the road with a few plugins that were broken or
deprecated or at least early beta]

for instance, if normally you wanted to only select articles
where “is_published = 1”

That’s a different case, and much easier to satisfy thanks to Rails
associations.

Ex:
class User << AR
has_many :articles
has_many :published_articles , :conditions => “is_published
= 1” ,
:class_name => ‘Article’, :foreign_key
=> ‘article_id’
end

ok I was aware of this option but how would I over-ride it if the
current user was an admin for instance? Do I have to create a separate
association for every combination of flags then, and call different
methods based on the role of the current_user? (say I have
is_published, is_deleted, is_public_domain - that’s 9 potential
associations, yux)

Thanks
Sam