PostgreSQL 12 有一个很酷的Generated Columns功能,但我无法在 Rails 中检查列是否是虚拟的。
作为参考,Rails 中的 MySQL 适配器允许您这样做
MyModel.supports_virtual_columns?
=> true
MyModel.columns.last.virtual?
=> false
但是在 PostgreSQL 适配器中你不能做同样的事情,尽管它确实支持生成的字段?
导轨 v.5.1.7
PostgreSQL 12 有一个很酷的Generated Columns功能,但我无法在 Rails 中检查列是否是虚拟的。
作为参考,Rails 中的 MySQL 适配器允许您这样做
MyModel.supports_virtual_columns?
=> true
MyModel.columns.last.virtual?
=> false
但是在 PostgreSQL 适配器中你不能做同样的事情,尽管它确实支持生成的字段?
导轨 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
它检查是否从 a 返回的 Extra 值
SHOW FULL FIELDS FROM table_name;
该列的查询与 VIRTUAL、STORED 或 PERSISTENT 匹配,如果匹配,则返回 true。
但这在 PostgreSQL 对应物中不存在。supports_virtual_columns?
将在任何未开发此功能的适配器中返回 false,因为它在ActiveRecord::ConnectionAdapters::AbstractAdapter
返回 false 中定义:
# Does this adapter support virtual columns?
def supports_virtual_columns?
false
end
从 rails 7开始为 postgresql 添加了该功能
所以你可以MyModel.columns.last.virtual?
在使用 mysql 时这样做