Rails PostgreSQL 检查列是否为虚拟列

Rails PostgreSQL check if column is virtual

PostgreSQL 12 有一个很酷的 Generated Columns 功能,但我无法在 Rails.

中检查列是否为虚拟列

作为参考,MySQL适配器在Railsallows你喜欢

MyModel.supports_virtual_columns?
=> true
MyModel.columns.last.virtual?
=> false

但是在 PostgreSQL Adapter 中你不能做同样的事情,尽管它支持生成字段?

Rails v.5.1.7

PostgreSQL 12 实现生成列的事实并不意味着您将通过 Rails PostgreSQLAdapter 接口来检查列是否为虚拟列,因为它尚未实现(尚未) .

如果您在 ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter 中看到 supports_virtual_columns? 的代码非常简单:

def supports_virtual_columns?
  mariadb? || database_version >= "5.7.5"
end

虽然检查列是否为虚拟列的代码表示为:

def virtual?
  /\b(?:VIRTUAL|STORED|PERSISTENT)\b/.match?(extra)
end

检查额外值是否return来自

SHOW FULL FIELDS FROM table_name;

对该列的查询与 VIRTUAL、STORED 或 PERSISTENT 匹配,如果匹配,则 return 为真。

但这在 PostgreSQL 对应项中不存在。 supports_virtual_columns? 将在任何未开发此功能的适配器中 return false,因为它在 ActiveRecord::ConnectionAdapters::AbstractAdapter 到 return false:

中定义
# Does this adapter support virtual columns?
def supports_virtual_columns?
  false
end

为 postgresql 添加了该功能 since rails 7

所以你可以像使用 mysql

那样做 MyModel.columns.last.virtual?