RoR模型似乎不像Ruby类?

时间:2012-10-16 21:50:42

标签: ruby-on-rails ruby oop activerecord ruby-on-rails-3.2

如果我有一个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)

如果有人能够对此有所了解,我将不胜感激。

非常感谢,

2 个答案:

答案 0 :(得分:10)

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

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

"#{first_name} #{last_name}"

有一个内置的“to_s”方法(在大多数对象上),允许您以这种方式将它们直接插入到字符串中。虽然您无法执行此操作:"string " + 1但未提出错误,您可以执行此操作:"string #{1}"

答案 1 :(得分:5)

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

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