我有一个带有@recipient
属性的对象responding
。比如,我希望responding
通过=f.check_box :responding, {}, 'Yes', 'No'
存储“是”或“否”,docs表示可能。{/ p>
表单提交Yes
或No
,PostgreSQL UPDATE语句按预期使用Yes
或No
(我在$ rails server
终端窗口中看到)。但是 - 无论responding
属性的数据类型(布尔值或字符串)如何 - 最终存储在数据库中的内容始终是true
或false
。我很困惑。幕后发生了什么?如何强制Rails存储Yes
或No
?我应该(不)?我误解了什么吗?
答案 0 :(得分:3)
来自fine manual:
<强> 8.6。布尔类型
[...]
&#34; true&#34;的有效文字值州是:TRUE 't' 'true' 'y' 'yes' 'on' '1'
对于&#34; false&#34; state,可以使用以下值:
FALSE 'f' 'false' 'n' 'no' 'off' '0'
因此字符串'yes'
和'no'
是SQL中true
和false
(分别)的有效别名。
如果您将布尔列设置为'yes'
,那么当您访问Rails中的值时,您将获得true
。 'yes'
是SQL中TRUE
的别名,Rails表示使用Ruby TRUE
的{{1}} SQL布尔值。同样适用于true
和'no'
。
当您展示模型时,最好将false
和true
Ruby值转换为false
和'Yes'
,而不是担心特定的您的布尔值在数据库中。
不确定这是否真的适用,因为对服务器重启以及列类型确实存在一些混淆。 OP想要另一个读取,所以我取消了这个。
答案 1 :(得分:1)
所以,如果你使用
=f.check_box :responding, {}, 'Yes', 'No'
使用正常form_for @recipient
它应该会显示一个值为yes的复选框。如果选中check_box,则保存的值为“是”。使用:string for column。如果未选中的值为“否”。
这将是正常的程序。好吧,我只能看到你使用复选框而不是check_box。
它应该是数据类型:string。你确定你使用的是:字符串而不是布尔值?如果使用布尔值,它将保存为true。您是否在更改后正确迁移并检查了 schema.rb ... 但是,我只是想帮忙,但如果这对你不起作用,我不知道问题可能是什么。 希望这可以帮助。祝好运!