默认自动选择隐藏的ROWID列
Posted
技术标签:
【中文标题】默认自动选择隐藏的ROWID列【英文标题】:Automatically select hidden ROWID Column by default 【发布时间】:2021-05-27 11:16:08 【问题描述】:首先,为现有应用程序设置数据库。它在 Advantage 数据库服务器上,我无法更改表结构。
某些表的“主键”设置为伪列ROWID
,它始终存在于所有表中,但默认情况下从不选择。
我已经说服适配器让它总是在columns
中宣布ROWID
的存在,这样我现在就可以愉快地运行annotate
和rake db:schema:dump
,但它仍然会导致问题对于我的模型,ROWID
不包含在标准选择的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"
有没有办法设置“默认范围”或类似的方法,以便表自动包含ROWID
列(至少在使用它作为“主键”的特定表上)? ...最好不使用表名,因为这并不总是合乎逻辑的
为了完整性而缩减模型:
class Worksheet < ApplicationRecord
self.table_name = 'WKSHEET'
self.sequence_name = :autogenerated
self.primary_key = 'ROWID'
end
对于喜欢轻松阅读数据库内部结构的任何人,this link 解释了 ADS ROWID
伪列
【问题讨论】:
【参考方案1】:这真的很简单,只需使用 select 添加 default_scope:
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 作为主键的模型中。
【讨论】:
以上是关于默认自动选择隐藏的ROWID列的主要内容,如果未能解决你的问题,请参考以下文章
在 kendo-ui 网格中显示/隐藏列后,有啥方法可以自动调整网格列宽?
winform中DataGridView 列隐藏时会触发啥事件?