我在rails控制台中写了以下内容。
> class Hello
> def method
> d = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
> d.each do |m|
> puts m.account_id
> end
> end
> end
=> :method
> Hello.method
ArgumentError: wrong number of arguments (0 for 1)
我无法弄清楚此代码中的错误。我该如何解决这个错误。
答案 0 :(得分:4)
您的方法名称“method”是Object类的现有方法,它最终由ruby中的所有类继承。
使用此名称定义实例方法,这样就可以了,如果已经存在,则会覆盖继承的实例方法。但是,当你来调用它时,你将其称为类方法(因为你在Hello
上调用它,这是类),所以你正在调用它现有的“方法”方法,抱怨没有得到任何参数。
将您的方法更改为“foo”,然后尝试Hello.foo
。您将得到“未定义的方法或变量”错误,因为没有foo
类方法。
然后做
hello = Hello.new
hello.foo
它会起作用。
编辑:
如果您希望它实际上是类方法,那么您可以通过以下任一方式来实现:
class Hello
def self.method
d = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
d.each do |m|
puts m.account_id
end
end
end
end
或
class Hello
#class methods go in here
class << self
def method
d = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
d.each do |m|
puts m.account_id
end
end
end
end
end
顺便说一下,使用有意义的变量名是一种惯例,通常是一个好主意。例如,如果您有一个作为Job对象集合的变量,则将其称为“jobs”,而不是“d”。然后,任何阅读代码的人都可以轻松记住该变量中的内容。
使用这个原则,我会重写你的代码:
def output_job_account_ids
jobs = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
jobs.each do |job|
puts job.account_id
end
end
end
看看现在发生的事情会更加明显吗?我也重命名了方法名称:通常一个方法名称描述方法的作用通常是个好主意。