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.