Rails如何解析模型属性,因为它们没有在模型中定义?

GMs*_*soF 1 ruby ruby-on-rails rails-activerecord

我开始学习Ruby和Rails,有时候"会议过度配置"会让我感到害怕......

好的,我User通过Rails命令在Rails中创建了一个模型.User用一些属性创建的模型,比如nameage.

但当我打开user.rb:

class User < ApplicationRecord
end
Run Code Online (Sandbox Code Playgroud)

它只有这些.我找不到了attr_accessor.所以我继续搜索,我发现属性名称和方法保存在某个地方,所以基本上我仍然可以像往常一样创建对象并引用属性user.nameuser.age.

我的问题是,Rails中的属性保存在哪里?这是怎么回事?我不认为属性也保存在超类中ApplicationRecord,我打开了application_record.rb:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
Run Code Online (Sandbox Code Playgroud)

那些属性保存在哪里?以及Ruby如何解析这个属性?我想知道背后的机制.

tad*_*man 5

ActiveRecord不会修改您的代码,也不会改变实现方式.相反,它是Ruby中常见的模式,是动态定义方法.这通常被称为"元编程",因为您的代码有效地编写代码.请注意,它不是字面上编写代码,只有当程序在内存中加载它才能转换自身.

通常通过运行SQL命令来自动发现列,SHOW FIELDS以确定结构和类型.然后相应地生成这些方法.

如果你想知道这个机制,你可以随时阅读ActiveRecord源代码,但要记住它做了很多事情,有时可能有点难以导航.