簡體   English   中英

Rails PostgreSQL 檢查列是否是虛擬的

[英]Rails PostgreSQL check if column is virtual

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看到了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

它檢查 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 時一樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM