我的模型“ datafile”有很多字段,我想从模型外部设置这些字段,例如

file = DataFile.new
file.owner = 123

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

我希望得到一个“未定义”错误或类似的错误。

有帮助吗?

解决方案

由于Rails的ORM使用ActivereCord模式,因此为与该表关联的数据库中的每个列自动创建了两种方法: columnName, , 和 columnName =. 。由于您的模型从ActivereCord :: Base继承而来,这是“自动”的。这些方法是使用Ruby的元编程设施定义的,并在课堂创建时动态创建。

有关究竟发生了什么的更多信息,我将查看Rails的来源。但是,以上可能足以使您对正在发生的事情有所了解。

其他提示

Drew和Zepplock做对了,但我只会再添加一件事。为数据库字段创建的栏杆(实际上是ActivereCord)的登录器不是Ruby访问者,如果使用脚本/控制台,您会看到所有者不是对象文件的实例变量。

直到您冒险远离标准配件并尝试在文件上的方法中操纵@esher之前,您可能永远不会注意到这一点。如果您同时学习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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top