【问题标题】:RoR models don't seem to act like a Ruby class?RoR 模型似乎不像 Ruby 类?
【发布时间】:2012-10-16 21:50:42
【问题描述】:

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

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

非常感谢,

【问题讨论】:

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


    【解决方案1】:

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

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

    "#{first_name} #{last_name}"
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-01-02
        • 2020-07-17
        • 1970-01-01
        • 2018-11-27
        • 2012-04-23
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 2019-01-29
        相关资源
        最近更新 更多