4

如果我有一个 RoR 模型 person.rb 如下:

class Person < ActiveRecord::Base
  attr_accessible :first_name, :last_name

  validates :first_name, presence: true
  validates :last_name, presence: true
end

我似乎无法执行以下任何操作:

@full_name = @first_name + " " + @last_name

或者

def full_name
   @first_name + " " + @last_name 
end

据我了解,这两者都应该与常规的 ruby​​ 课程一起使用。

我做了一些阅读,下面似乎是要走的路:

def full_name
    self.first_name + " " + self.last_name
end

我可以完成这项工作,但我真的很想了解为什么我似乎无法以任何方式引用实例变量(也不能创建新变量)。

ActiveRecord::Base 对实例变量做了一些非常有趣的事情吗?它是否将模型(在这种情况下为 Person 类)限制为仅是数据库中内容的包装器?

我似乎也无法定义 attr_accessor ......但我可以很好地设置 first_name 和 last_name (不仅通过批量分配而且 p = Person.new; p.first_name = foo)

如果有人可以请对此有所了解,将不胜感激。

非常感谢,

4

2 回答 2

10

ActiveRecord 模型属性存储在一个名为 的实例变量中@attributes,它是一个散列。为您定义了 getter 和 setter 以访问此变量。

顺便说一句,这是在 Ruby 中连接字符串的推荐方法:

"#{first_name} #{last_name}"

有一个内置的“to_s”方法(在大多数对象上)允许您以这种方式将它们直接插入到字符串中。虽然你不能这样做:"string " + 1在不引发错误的情况下,你可以这样做:"string #{1}"

于 2012-10-16T22:00:52.150 回答
5

Active Record 不会将数据库属性存储在单个实例变量中,这就是为什么您必须使用它提供的访问器以及生成的访问器attr_accessor不起作用的原因。

相反,Active Record 将属性存储在散列中(在类型转换之前和之后),但是这是您不必担心的实现细节。

于 2012-10-16T21:58:16.820 回答