Method on a array of objects from the database

Hello,

I would like to know the more elegant way to add a method for an array
of objects from the database.

Let me give an example :

Class Product

end

And in my controller :

@products = Product.find(:all)

And now I want to define a method which I could like

@products.select_fruits

having said somewhere :

def select_fruits

end

Thank you very much,

Pierre

On Nov 29, 2007, at 11:23 AM, Pierre V. wrote:

end
Is you question about where those methods should go? They can, and
usually should, go in the model.

class Product

def self.find_all
find(:all, …)
end

def self.select_fruits(parameters)
find(:all, :conditions…
end

end

— controller –

fruits = Product.select_fruits(:fruit_type = params[:…])


def gw
acts_as_n00b
writes_at(www.railsdev.ws)
end

Thank you for your answer but my question is how to add method to an
array of @products.

I have : @products.find(:all)

Then, if I want to select only fruits from @products, I could do :
@products.select {…}
And it’s this select that I want to put in a method select_fruits so
that I could do :

@products.select_fruits which corresponds to @products.select { … }

Thank you,
Pierre

@products = Product.find(:all)

And now I want to define a method which I could like

@products.select_fruits

having said somewhere :

module Foo
def select_fruits
# some code here
end
end

meanwhile… back on the farm…

@products = Product.find(:all)
@products.extend Foo

=================== Or even better… =========================
class Product
belongs_to :fruit, :extends => Foo
end

Look for “Association extensions” within the Rails api…

hth…

ilan

Thanks you ! It’s great !
Pierre

One way is to make your own finder directly on the model

class Product < ActiveRecord::Base

def self.find_all_fruits
self.find :all, :condition => ["category = “fruit”]
end

end

Although you don’t have to bother if you can tell by looking at a
field.
For example, if you have a “category” column that shows “fruit”, you can
just use a dynamic finder for that

@fruit = Product.find_all_by_category(“fruit”)
@fruit_in_stock =
Product.find_all_by_category_and_available(“fruit”,true)

You should be letting your database do the work of filtering records, as
that’s its job. You don’t want to iterate and reject / filter records in
Ruby. It’s much slower. It looks cool but it’s not worth it.