If thats the case, when should one use a named scope over a method?
For example:
Product.find_by_category(category).
find_by_category can either be a named scope or a method in the
Product model. I was under the impression that named scopes cant
accept an attribute and this was the main difference. Apparently, it
can!
If thats the case, when should one use a named scope over a method?
For example:
Product.find_by_category(category).
find_by_category can either be a named scope or a method in the
Product model. I was under the impression that named scopes cant
accept an attribute and this was the main difference. Apparently, it
can!
So when does one use named scopes over methods?
A named_scope is a method, or as near as matters. Use whichever is
easier to implement and otherwise more suitable to your use case.
If thats the case, when should one use a named scope over a method?
For example:
Product.find_by_category(category).
find_by_category can either be a named scope or a method in the
Product model. I was under the impression that named scopes cant
accept an attribute and this was the main difference. Apparently, it
can!
So when does one use named scopes over methods?
(Nitpicking: a call to named_scope (or scope in rails 3) does just
define a method of a particular form)
Scopes are chainable which can be very handy. On the other hand there
is only so much a scope can do - scopes boil down to a single query to
the database, so if you need to do more, then you'll probably want to
wrap up the extra work in a method.
Sometimes if I need to do a calculation before I call a named scope or if I want to make a different query based on the input, I do something like this:
class Media < AR:Base
def dvds(name = "")
if name.blank?
Media.scoped({})
else
name.downcase!
Media.scoped(:conditions => {:name => name})
end
end
end
In either case, it's still chainable. This is Rails2 code, but I'm sure you could do something similar with Rails3.
My suggestion (below) was to illustrate that you could have something that looks like a named scope (dvds) actually be a method. At some point the logic you need to apply may not fit nicely into a single named_scope call and I find this to be a good way to handle these situations.