了解Ruby on Rails ActiveRecord模型访问器

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

 file = DataFile.new
 file.owner = 123

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

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

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

有关正在发生的事情的更多信息,我将查看Rails源代码。 但是,上述内容可能足以让您对正在发生的事情有所了解。

Drew和Zepplock做对了,但我还要补充一点。 Rails(实际上,ActiveRecord)为数据库字段创建的访问器不是Ruby访问器,如果使用脚本/控制台,您将看到所有者不是目标文件的实例变量。

在您远离标准访问器并试图在文件中的方法中操纵@owner之前,您可能永远不会注意到这一点。 如果你在学习Rails的同时学习Rails(这就是我所做的),那么你可能会在某些时候碰到这个问题。 这就是你需要写的原因:

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 

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