如果我在rails活动模型方法上调用方法,如下所示:
class Foo < ActiveRecord::Base
end
Foo.first
我将取回第一张有效唱片。我不必实例化该类。
但是如果我创建自己的类并调用方法,我会得到一个例外:
class Person < ActiveRecord::Base
def greeting
'hello'
end
end
Person.greeting
#EXCEPTION: undefined method `greeting' for Person:Class
如何解决这个问题呢?
答案 0 :(得分:12)
有几种方法。最重要的两个是:实例方法和类实例方法。
Foo.first
是一个类实例方法。它适用于类实例(在本例中为Foo
)。如果它在类中存储了一些数据,那么该数据将在整个程序中全局共享(因为只有一个名为Foo的类(或者确切地说是::Foo
)。)
但是你的greeting
方法是一个实例方法,它需要对象实例。例如,如果您的greeting方法将使用Person的名称,则它必须是实例方法,以便它能够使用实例数据(名称)。如果它不使用任何特定于实例的状态,并且您真的认为它是类实例方法,那么使用self
“前缀”。
class Person < ActiveRecord::Base
def self.greeting
'hello'
end
end
答案 1 :(得分:8)
尝试类方法:
class Person < ActiveRecord::Base
def self.greeting
'hello'
end
end
或另一种语法:
class Person < ActiveRecord::Base
class << self
def greeting
'hello'
end
end
end
答案 2 :(得分:2)
class Person < ActiveRecord::Base
def Person.greeting
'hello'
end
end
也会工作。我喜欢它,因为它非常清楚它的作用;但是,当您决定重命名Person类时,它将导致错误。
答案 3 :(得分:1)
class Person < ActiveRecord::Base
def self.greeting
'hello'
end
end
答案 4 :(得分:0)
要做静态方法,请尝试:
class MyModel def self.do_something puts "this is a static method" end end MyModel.do_something # => "this is a static method" MyModel::do_something # => "this is a static method"