默认情况下自动 select 隐藏 ROWID 列

Automatically select hidden ROWID Column by default

首先,为现有应用程序设置数据库。它位于 Advantage 数据库服务器上,我无法更改 table 结构。

一些 table 将“主键”设置为伪列 ROWID,它始终存在于所有 table 上,但永远不会 select默认编辑。

我已经说服了适配器,它总是在 columns 中宣布 ROWID 的存在,这样我就可以 运行 一个 annotate,并且rake db:schema:dump 现在很高兴,但它仍然给我的模型带来问题,因为 ROWID 未包含在标准 select 的 select * 中:

Worksheet.last
 => #<Worksheet ROWID: nil, FILENAME: "2130002", CREATED: "2021-03-04", ANALYST: "CJH", WKSTATUS: "PURGED", DETS: "02535", FIRSTSAMP: 0.106499e6, CHECKDATE: nil, CHECKTIME: "", CHECKEDBY: "", EXCEL: false>

Worksheet.last.ROWID
 => nil

Worksheet.select("ROWID, WKSHEET.*").last
 => #<Worksheet ROWID: "CFTquNBaHrvwAAAAAF", FILENAME: "2130002", CREATED: "2021-03-04", ANALYST: "CJH", WKSTATUS: "PURGED", DETS: "02535", FIRSTSAMP: 0.106499e6, CHECKDATE: nil, CHECKTIME: "", CHECKEDBY: "", EXCEL: false>

Worksheet.select("ROWID, WKSHEET.*").last.ROWID
 => "CFTquNBaHrvwAAAAAF"

有没有一种方法可以设置“默认范围”或类似的方法,以便 table 自动包含 ROWID 列(至少在特定的 table 中使用此列作为“主键”)? ...最好不要使用 table 名称,因为这并不总是合乎逻辑的

为完整性删减模型:

class Worksheet < ApplicationRecord
  self.table_name = 'WKSHEET'
  self.sequence_name = :autogenerated
  self.primary_key = 'ROWID'
end

对于喜欢简单阅读数据库内部结构的人来说,this link 解释了 ADS ROWID 伪列

这真的很简单,只需添加一个 default_scope 和一个 select:

class Worksheet < ApplicationRecord
  self.table_name = 'WKSHEET'
  self.sequence_name = :autogenerated
  self.primary_key = 'ROWID'

  default_scope { select("#{table_name}.ROWID, #{table_name}.*") }
end

输出:

Worksheet.last
 => #<Worksheet ROWID: "CFTquNBaHrvwAAAAAF", FILENAME: "2130002", CREATED: "2021-03-04", ANALYST: "CJH", WKSTATUS: "PURGED", DETS: "02535", FIRSTSAMP: 0.106499e6, CHECKDATE: nil, CHECKTIME: "", CHECKEDBY: "", EXCEL: false>

Worksheet.last.ROWID
 => "CFTquNBaHrvwAAAAAF"

更好的是,通过使用 #{table_name},我可以将该行复制并粘贴到所有使用 ROWID 作为主键的模型。