默认情况下自动 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 作为主键的模型。
首先,为现有应用程序设置数据库。它位于 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 作为主键的模型。