Method on a array of objects from the database

1 view
Skip to first unread message

Pierre Valade

unread,
Nov 29, 2007, 2:23:49 PM11/29/07
to Ruby on Rails: Talk
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

Greg Willits

unread,
Nov 29, 2007, 2:48:50 PM11/29/07
to rubyonra...@googlegroups.com

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

Pierre Valade

unread,
Nov 29, 2007, 2:52:59 PM11/29/07
to Ruby on Rails: Talk
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

Brian Hogan

unread,
Nov 29, 2007, 3:34:13 PM11/29/07
to rubyonra...@googlegroups.com
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.
 
 
 
 
 


 
On Nov 29, 2007 1:52 PM, Pierre Valade <pierre...@gmail.com> wrote:

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

I have : @ products.find(:all)

Ilan Berci

unread,
Nov 29, 2007, 4:37:19 PM11/29/07
to rubyonra...@googlegroups.com

>
> @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

--
Posted via http://www.ruby-forum.com/.

Pierre Valade

unread,
Nov 30, 2007, 4:20:16 AM11/30/07
to Ruby on Rails: Talk
Thanks you ! It's great !
Pierre
Reply all
Reply to author
Forward
0 new messages