我有一个Rails模型类
class Model < ActiveRecord::Base
has_many :object_collection
def add_object(object)
object_collection.push object // works
@object_collection.push object // does not work
self.object_collection.push object // works
end
end
我想知道是否有人能向我解释为什么“现在还不起作用”我想这两个意思是一样的
干杯
最佳答案
他们不一样。考虑下面的ruby代码:
class Person
attr_accessor :employer
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
方法可以方便地为您生成属性读取器和写入器(
attr_accessor
和employer=
)。您可以使用这些方法来读写属性,该属性存储在实例变量employer
中。现在,我们可以将上面的代码重写为下面的代码,其功能与上面的代码相同:
class Person
def employer=(new_employer)
@works_for = new_employer
end
def employer
@works_for
end
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
现在,实例变量
@employer
不再使用。我们选择手动编写访问器,并有权为实例变量选择不同的名称。在这个特定的例子中,实例变量的名称不同于属性访问器的名称。没有什么能阻止你这么做。这类似于
@employer
如何在内部存储其属性。它们不存储在同名的实例变量中,这就是为什么对ActiveRecord
的调用不起作用。如您所知,属性读取器和编写器提供了某种抽象,可以向您隐藏实现细节。因此,直接在子类中读写实例变量通常被认为是不好的做法。