Ruby on Rails中如何从数据库函数获取单个结果?
解决方案
直接获取并转换布尔值(推荐)
使用select_value方法可以直接拿到查询结果的第一行第一列值,这是最简洁的方式。PostgreSQL返回的布尔值在Ruby中是字符串"t"(对应true)或"f"(对应false),直接判断即可:
# 获取函数返回值 receipt_enabled = ActiveRecord::Base.connection.select_value("SELECT receipt_enabled FROM schema.receipt_enabled(158800)") # 转换为Ruby布尔值并赋值 @showreceipt = receipt_enabled == 't'
如果想更规范地使用ActiveRecord的类型转换逻辑,可以用内置的布尔类型转换器:
boolean_converter = ActiveRecord::Type::Boolean.new receipt_enabled = ActiveRecord::Base.connection.select_value("SELECT receipt_enabled FROM schema.receipt_enabled(158800)") @showreceipt = boolean_converter.cast(receipt_enabled)
基于你已尝试的方式改造
如果你想沿用之前的execute.to_a或select_all.rows写法,只需提取对应的值再做判断:
方式1:基于execute.to_a的结果
result = ActiveRecord::Base.connection.execute("SELECT receipt_enabled FROM schema.receipt_enabled(158800)").to_a @showreceipt = result.first["receipt_enabled"] == 't'
方式2:基于select_all.rows的结果
result = ActiveRecord::Base.connection.select_all("SELECT receipt_enabled FROM schema.receipt_enabled(158800)").rows @showreceipt = result.first.first == 't'
关键说明
你之前的逻辑不生效是因为PostgreSQL返回的布尔值在Ruby中是以字符串"t"/"f"形式存在的,不是Ruby原生的true/false,所以直接用result == true无法匹配。
内容的提问来源于stack exchange,提问作者Lucho
相关产品推荐
相关产品推荐

