2

我的模型“DataFile”有一堆我想从模型外部设置的字段,例如

文件 = DataFile.new
文件所有者 = 123

现在,据我所知,对于我想从外部修改的每个字段,我必须在我的模型中放置一个“attr_accessor:field”。但是,上面的代码在没有定义任何 attr_accessors 的情况下运行良好,将 owner 字段设置为 123。这是为什么呢?

我预计会收到“未定义方法”错误或类似的错误。

4

3 回答 3

11

因为 Rails 的 ORM 使用 ActiveRecord 模式,所以会为与该表关联的数据库中的每一列自动创建两个方法:columnnamecolumnname=。由于您的模型继承自 ActiveRecord::Base,这会“自动”发生。这些方法是使用 ruby​​ 的元编程工具定义的,并在类创建时动态创建。

有关到底发生了什么的更多信息,我会查看 Rails 源代码。但是,以上内容可能足以让您对正在发生的事情有一个有效的了解。

于 2009-10-19T13:57:58.753 回答
1

Drew 和 Zepplock 说得对,但我再补充一件事。Rails(实际上是 ActiveRecord)为数据库字段创建的访问器不是 Ruby 访问器,如果您使用脚本/控制台,您会发现 owner 不是目标文件的实例变量。

在您冒险离开标准访问器并尝试在文件中的方法中操作 @owner 之前,您可能永远不会注意到这一点。如果您在学习 Rails 的同时学习 Ruby(我就是这样做的),那么您很可能会在某个时候遇到这个问题。这就是您需要编写的原因:

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner = owner << " no longer owns this"
    save
  end
end

代替

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner << " no longer owns this"
    save
  end
end
于 2009-10-19T16:38:41.893 回答
0

最有可能的“所有者”是您的数据库模型的一部分。数据库字段的访问器是为您自动生成的。

于 2009-10-19T13:58:10.737 回答