【问题标题】:Problem with boolean fields in active record with firebird database火鸟数据库的活动记录中的布尔字段问题
【发布时间】:2019-11-30 06:31:33
【问题描述】:

我正在将 Rails 应用程序从 4.2 升级到 5.x。我们正在使用一个 firebird 数据库,最近发现了一个 new adapter,它也可以与 Rails 5 一起使用。
在测试应用程序后,大部分东西都在工作。但是我对标记为长度为 1 的 char 字段的列有问题 - 我们将此列用作布尔字段。 “F”表示假,“T”表示真。

在我们的应用程序中,我们在数据库中查询这样的字段:

model.where(inaktiv: [false, nil]

这会导致这样的 sql 语句:

select * from model where inaktiv in ('f', null)

我遇到的问题是小写的 f。我在映射到字符串的活动记录 gem 中进行了搜索,但找不到该位置。这是在哪里完成的?

【问题讨论】:

标签: ruby-on-rails ruby firebird


【解决方案1】:

通常,如果要传递要查找的数组或只传递一个值,可以创建类似 model.where("field IN (?)", ['F', 'T']) 的查询,例如:model.where("field = ?", 'T')

我不建议干预 ActiveRecord 的内部结构。风险自负。

【讨论】:

  • 如果它设法生成带有X in (null) 种类谓词的查询,那么这个库无论如何都会损坏(或者我们可能会说尚未完善)。但这毕竟是 FLOSS,任何 FLOSS 库都会成为 your 程序的一部分,而您只是没有从头开始编写而是只写了一半。不会让接收者从你程序的后半部分工作中解脱出来,包括现在你的 FLOSS 库。
  • 虽然可能不适合做in (null),但火鸟并没有抱怨,甚至还给了正确的行。
  • @shimu “右行”是什么意思?它当然不会抱怨。它也不会抱怨delete from tablename -- where.... - 一个在语法上有效的构造,尽管很明显这是一个将小行集的删除变成整个表的不可控制擦除的失误。这是脚本:它不返回 3 而只返回 2! Select count(*) from ( select 1 as id, 'aaa' as payload from rdb$database union all select 2, 'bbbbb' from rdb$database union all select null, 'cc' from rdb$database union all select 3, 'dddddd' from rdb$database ) d where d.id in (2,3,5, null)
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2013-10-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多