Wrong number of arguments (2 for 1)


#1

Hi,

Im having trouble figuring out how to query my database in ruby and
i’m hoping someone can help me out.

I’d like to find all my departments that match a permalink passed from
the url. The department must also match a particular category, also
passed through the url.

I have written the following code. But unfortunatley I get an error
“wrong number of arguments (2 for 1)”

category = params[:category]
department = params[:department]

@departments = Department.find(:all, :conditions => [“permalink = ?”,
department])
@department = @departments.find(:all, :conditions => [“category = ?”,
category])

If anyone could shed some light on this it would be greatly appreciated.
Thanks,
Paul.


#2

@departments = Department.find(:all, :conditions => [“permalink = ?”,
department])
@department = @departments.find(:all, :conditions => [“category =
?”, category])

Is this an exact copy of the code? The find :all will return a hash
even if there is only one result row. So in the above @department will
always be a hash.

If you want only one department then use find :first which returns a
scaler of the row.

As an aside you can also combine the two statements:

@department = Department.find(:first, :conditions => [“permalink = ? and
category = ?”, department, category])


#3

Hello Paul,

@departments = Department.find(:all, :conditions => [“permalink = ?”,
department])
@department = @departments.find(:all, :conditions => [“category = ?”, category])

@departments is an array of Department objects created by
the class method Department#find.

In the second line, since @departments is an array, you are using
Enumerable#find which require 0 or 1 argument and 1 block.
So that’s not the find method you want to use, and that’s not the
right way to use Enumerable#find as well :slight_smile:

so you’d better do :

@departments = Department.find(:all,
:conditions => [“permalink = :department AND category = :category”,
params ])

РJean-Fran̤ois.