sql - 为什么我可以在这里调用类方法,就好像它是实例方法一样?
问题描述
我正在查看这个例子:
class SQLObject
def self.columns
return @columns if @columns
columns = DBConnection.execute2(<<-SQL).first
SELECT
"#{table_name}".*
FROM
"#{table_name}"
LIMIT
0
SQL
columns.map!(&:to_sym)
@columns = columns
end
def self.table_name
@table_name ||= self.name.underscore.pluralize
end
def insert
column_symbols = self.class.columns.drop(1)
column_names = column_symbols.map(&:to_s).join(", ")
question_marks = (['?'] * column_symbols.count).join(", ")
DBConnection.execute(<<-SQL, *attribute_values)
INSERT INTO
#{self.class.table_name} (#{column_names})
VALUES
(#{question_marks})
SQL
self.id = DBConnection.last_insert_row_id
end
end
我很困惑为什么可以在“self.columns”方法中调用 table_name 方法,就好像它是一个实例方法一样。“table_name”方法不是类方法吗?因此,它不应该在“self.columns”方法中也被称为“self.class.table_name”吗?
解决方案
在抽象类中时,self
指的是正确的类,而不是对象。这就是为什么您无需明确告知即可访问该方法的原因self
推荐阅读
- laravel-7.x - Laravel php artisan 队列工作并在作业为空时停止
- c++ - 模板参数推导与结构化绑定不同
- python - Cloud Run 在请求中间死掉并返回 400
- sockets - 在 Flutter 中监听 API 变化
- react-native - 未连接任何应用程序。向所有 React Native 应用程序发送“重新加载”失败。确保您的应用程序正在模拟器或通过 USB 连接的手机上运行
- android - 在另一台计算机上编译时出现 Google SignIn API 异常 10
- react-native - 尝试为选项卡按钮添加显示/隐藏逻辑
- c++ - 在 qml 中处理页面
- node.js - docker容器中的nodejs twitter api抛出401错误
- amazon-web-services - AWS ECS 通过 bash 从容器内将文件上传到存储桶