我已经读过ruby对象只是我们可以存储实例变量(和类指针)的地方。所以:
class Person
def initialize(age)
@age = age
end
end
现在,如果我们运行:
p = Person.new(101)
然后我们得到:
#<Person:0x86cf5b8 @age=101>
很好,属性年龄按预期存储为实例变量。但是如果我们将模型转换为从ActiveRecord继承,那么事情会有所不同。现在,在实例化一个新的Person之后,我们看到了:
# timestamps removed
#<Person id: 1, age: 101 >
age 属性不再显示为实例变量。那么这里到底发生了什么?
我知道我们可以访问@attributes
实例变量,其中包含所有属性和值的哈希,所以我想知道ActiveRecord是否可能修改控制台输出以这种方式呈现对象属性
是否可以实例化一个Ruby对象,其中属性是作为属性而不是实例变量而不使用ActiveRecord?
答案 0 :(得分:3)
是的,您可以使用include ActiveModel::AttributeMethods
扩展ruby类,以将实例变量公开为ActiveModel
- 类似属性。
See the docs了解更多信息。
答案 1 :(得分:1)
正如你在代码中看到的那样'存储'属性,因为实例变量是你自己做的,所以如果你想以任何其他方式持有它们,也取决于你。 ruby为您提供了方便的类方法来定义getter和setter方法,如attr_accessor。
还值得注意的是,如果从ActiveRecord :: Base继承,则不应覆盖initialize。
答案 2 :(得分:0)
好吧,有点儿。负责该方法的方法是我想知道ActiveRecord是否可能修改控制台输出以这种方式呈现对象属性。
inspect
和it's implemented by Object,其方式是(emplasis mine):
...显示对象的类名,对象id的编码,实例变量及其值的列表(通过在每个上调用inspect)。
之后还有更多:
用户定义的类应该重写此方法,以更好地表示obj。
这正是ActiveRecord所做的以及您看到此输出的原因。重写的方法不会列出实例变量,但会显示AR属性。
因为你没有在控制台中看到实例变量并不意味着它不存在!