Ruby on rails Firebird域作为Rails类型

Ruby on rails Firebird域作为Rails类型,ruby-on-rails,ruby,activerecord,firebird,Ruby On Rails,Ruby,Activerecord,Firebird,我正在为firebird rails适配器开发补丁。我的目标是,如果列的域具有已定义的名称,则可以将列定义为布尔类型 我在模块SchemaStatements中的方法fetch\u type\u metadata中找到了用于创建FirebirdColumns的SqlTypeMetadata类 但是,似乎只有在获取数据之后才使用此选项,因此它不会在查询中使用定义的真/假值。所以,现在,我正在寻找一种方法,以适配器为基础告诉ActiveRecord列的类型。我阅读了文件schema_定义和schem

我正在为firebird rails适配器开发补丁。我的目标是,如果列的域具有已定义的名称,则可以将列定义为布尔类型

我在模块
SchemaStatements
中的方法
fetch\u type\u metadata
中找到了用于创建
FirebirdColumns
SqlTypeMetadata

但是,似乎只有在获取数据之后才使用此选项,因此它不会在查询中使用定义的真/假值。所以,现在,我正在寻找一种方法,以适配器为基础告诉ActiveRecord列的类型。我阅读了文件schema_定义和schema_语句好几次,以防我遗漏了一些东西,但我在那里找不到方法


哪里有一个方法可以覆盖以使类型转换正确?

Firebird不会在准备好的查询的绑定信息中传递有关列的域的信息。它只传递基本的底层数据类型信息。因此,如果您定义了一个域
X
,其基本类型为
CHAR(1)
,那么Firebird将以
CHAR(1)
的形式进行通信,而不是以
X
的形式进行通信


除了查询元数据表以获取其他信息外,没有获取域的选项。因此,您想要实现的要么是不可能的,要么至少是复杂的。

Firebird 3具有本机布尔类型。Firebird 2即将被弃用。是否真的需要一个模拟布尔值的补丁?
但似乎只有在获取数据后才使用它
我不知道Ruby,但查询的SQL执行一般分为三个阶段:1)创建查询的源文本,2)“查询准备”-即将源代码传递给服务器以将其编译为其内部执行语言,3)查询执行(通过运行已编译的“准备好”查询获取数据)。Firebird在“准备”阶段之后和“获取”阶段之前返回数据类型。o数据可以是
SQL域
——这是一种显式创建的命名数据类型,在列外部声明,例如在官方文档中:
创建域D_布尔值作为字符(3)检查(值在('Yes','No')
然后
创建表(X D_BOOLEAN)
@Arioch'虽然我们升级到Firebird 3,但仍有许多列使用域作为BOOLEAN。所以,我需要它来确保我遇到的问题是ActiveRecord没有将列识别为布尔值,而是将列识别为字符串。在我们的例子中,列是一个限制为1且域为布尔值的字符。因此,类型转换是错误的,并且Generated sql不起作用。这就是为什么我要搜索一个方法来告诉适配器该列属于不同类型的原因。现在它也知道字段何时为布尔值,以及如何使用正确的字符查询数据库/int@Shimu很高兴听到。考虑把答案放在你所做的更改中。它也可能对其他人有用。