Ruby实例变量与ActiveRecord属性

时间:2012-06-07 13:13:44

标签: ruby-on-rails ruby activerecord

我已经读过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?

3 个答案:

答案 0 :(得分:3)

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

See the docs了解更多信息。

答案 1 :(得分:1)

正如你在代码中看到的那样'存储'属性,因为实例变量是你自己做的,所以如果你想以任何其他方式持有它们,也取决于你。 ruby为您提供了方便的类方法来定义getter和setter方法,如attr_accessor。

还值得注意的是,如果从ActiveRecord :: Base继承,则不应覆盖initialize。

答案 2 :(得分:0)

  

我想知道ActiveRecord是否可能修改控制台输出以这种方式呈现对象属性。

好吧,有点儿。负责该方法的方法是inspectit's implemented by Object,其方式是(emplasis mine):

  

...显示对象的类名,对象id的编码,实例变量及其值的列表(通过在每个上调用inspect)。

之后还有更多:

  

用户定义的类应该重写此方法,以更好地表示obj。

这正是ActiveRecord所做的以及您看到此输出的原因。重写的方法不会列出实例变量,但会显示AR属性。

因为你没有在控制台中看到实例变量并不意味着它不存在!