0

我们有一个正在运行的脚本,它从我们的 AS400 中提取信息并将数据插入到我们的数据库中。

在我们的管理控制面板中,我们有一些覆盖复选框。这些框在选中时会在产品表中设置为“1”。这允许我们覆盖被发送的数据,无论它被检查多久:

# check for WEBDB name override flag
if webdb_itm['override_name_and_description'] == '1'
  as400_itm[product_map['name']] = webdb_itm['name']
  as400_itm[product_map['description']] = webdb_itm['description']
end

# check for WEBDB price sheet sub category override flag
if webdb_itm['override_category'] == '1'
  as400_itm[product_map['ps_sub_category_id']] = webdb_itm['ps_sub_category_id']
end

# check for WEBDB as400 sub category override flag
if webdb_itm['override_as_sub_category'] == '1'
  as400_itm[product_map['as_sub_category_id']] = webdb_itm['as_sub_category_id']
end

这是一个 SQL 转储,因此您可以看到数据库中的数据是相同的:

override_category tinyint(1) DEFAULT NULL,
override_as_sub_category tinyint(1) DEFAULT NULL,
override_name_and_description tinyint(1) DEFAULT NULL,

这是三个复选框,您可以看到它们都在查看覆盖是否为“1”。

底部的两个复选框可以正常工作,但顶部的复选框不能正常工作。如果选中了顶部并且运行了脚本,它将在不应该时填充来自 AS400 的数据。底部的两个工作正常,当检查时,它们只是忽略数据。

我检查了数据库并看到了1,1,1,所以一切似乎都很好。

关于我没有看到的任何想法?

4

1 回答 1

0

通常,如果您将数据库中的字段设置为某种类型,例如“int”,您的数据库驱动程序或 ORM 将遵循该类型并将值强制/强制转换为该语言的适当类型。

在 Ruby 中,使用 Active Record 或 MySQL 或 PostgreSQL 驱动程序/gems 或 Sequel ORM,您将获得整数。你没有说你用什么来与数据库交谈,但它应该在某个地方将值强制返回到它们的 Ruby 等价物,而不是将所有内容都作为字符或字符串返回。如果它是内部编写的工具,那么,有一个功能请求正在等待中。

这意味着,您的代码需要与整数进行比较:

if webdb_itm['override_name_and_description'] == 1
  as400_itm[product_map['name']] = webdb_itm['name']
  as400_itm[product_map['description']] = webdb_itm['description']
end

# check for WEBDB price sheet sub category override flag
if webdb_itm['override_category'] == 1
  as400_itm[product_map['ps_sub_category_id']] = webdb_itm['ps_sub_category_id']
end

# check for WEBDB as400 sub category override flag
if webdb_itm['override_as_sub_category'] == 1
  as400_itm[product_map['as_sub_category_id']] = webdb_itm['as_sub_category_id']
end

也就是说,使用整数来表示布尔值,即复选框所代表的(开/关)是错误的,但这可能是遗留问题,或者您的 AS400 DBM 可能不支持布尔值。

于 2013-07-10T20:56:53.183 回答