How to pass values to named scope?

In my Video model i have:

class Video < Media
  scope :genre, where(['genres.name = ?',
params[:genre].capitalize]).includes({:artist => {:user => :genre}})
  ....
end

As you see above, params[:genre].capitalize is a dynamic value. How do
I pass a value when I call Video.genre?

Or are we not allowed to pass attributes/values to named scopes?

Should I use a function instead? For example:

def find_by_genre(genre)
  self.where(['genres.name = ?', genre).includes({:artist => {:user
=> :genre}})
end

Christian Fazzini wrote:

In my Video model i have:

class Video < Media
  scope :genre, where(['genres.name = ?',
params[:genre].capitalize]).includes({:artist => {:user => :genre}})
  ....
end

As you see above, params[:genre].capitalize is a dynamic value. How do
I pass a value when I call Video.genre?

Or are we not allowed to pass attributes/values to named scopes?

Read the AR rdoc on named_scopes. It explains this quite clearly.
(Hint: lambdas are involved.)

Best,

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?

Please quote when replying.

Christian Fazzini wrote:

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.

Best,

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.

Fred

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.

Luke

Could that just be
Media.scoped( :conditions => {:name => name.downcase!} unless name.blank? )
or something similar, I have not tried it.

Colin

Hi Colin, yes something like what you've proposed would work. This is the most concise syntax I could come up with to get your suggestion working.

Media.scoped(:conditions => (name.blank? ? {:name => name.downcase!} : {}))

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.

Luke