Ruby 实例变量与 ActiveRecord 属性

ste*_*och 5 ruby activerecord ruby-on-rails

我读过 ruby​​ 对象只是我们可以存储实例变量(和类指针)的地方。所以:

class Person
  def initialize(age)
    @age = age
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,如果我们运行:

p = Person.new(101)
Run Code Online (Sandbox Code Playgroud)

然后我们得到:

#<Person:0x86cf5b8 @age=101>
Run Code Online (Sandbox Code Playgroud)

太好了,正如预期的那样,属性age存储为实例变量。但是如果我们将模型转换为从 ActiveRecord 继承,事情就会有所不同。现在,在实例化一个新的 Person 之后,我们看到:

# timestamps removed
#<Person id: 1, age: 101 > 
Run Code Online (Sandbox Code Playgroud)

年龄属性似乎不再是一个实例变量。那么这里到底发生了什么?

我知道我们可以访问@attributes实例变量,它包含所有属性和值的散列,所以我想知道 ActiveRecord 是否可能修改控制台输出以这种方式显示对象属性。

是否可以在不使用 ActiveRecord 的情况下实例化一个 Ruby 对象,其中属性作为属性而不是实例变量保存?

小智 3

是的,您可以扩展 ruby​​ 类,include ActiveModel::AttributeMethods将实例变量公开为ActiveModel类似属性。

请参阅文档以获取更多信息。