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

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[:....])

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

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.

Thanks you ! It's great !
Pierre