【问题标题】:How save nil in database using radio button如何使用单选按钮在数据库中保存 nil
【发布时间】:2025-12-22 22:00:17
【问题描述】:

我有单选按钮,我想用它来保存考勤信息: 是的,不,也许

HAML 中的代码:

= f.input :attendee, :as => :radio, :collection => { "Yes" => true, "No" => false, "Maybe" => nil }, :label => "Attendence:"

数据库中的现场参与者是布尔类型。 当我将值从 Yes/No 更改为 Maybe 时,rails 没有在数据库中保存“nil”。我应该怎么做才能保存'nil'

【问题讨论】:

  • 在迁移中,您是否为参加者设置了默认值?如果是,则它永远不会保存 nil 值,否则它会
  • 我将 nil 设置为参加者的默认值
  • 您能否在提交表单时添加(在对您的问题进行编辑时)勾选“可能”的参数值?它将在您的日志中。
  • 我想试试 "Maybe" => ""
  • @chaitanyasaraf 谢谢你,你的回答有效:) 回答,因为我不能投票

标签: ruby-on-rails ruby input radio-button field


【解决方案1】:

如果布尔值默认设置为 true 或 false,则它不会接受 null 值,否则您可以将空白值传递给布尔字段,如下所示。

= f.input :attendee, :as => :radio, :collection => { "Yes" => true, "No" => false, "Maybe" => "" }, :label => "Attendence:"

【讨论】:

  • 值可能会在客户端上更改,因此您不希望将域逻辑基于客户端值。由于 op 提到他已经将默认值设置为 nil - 只需接受参数并过滤掉任何不是 true 或 false 的值。 ``` def Attendee_params params.permit(attendence: ["1", "2"]) #不要记住强大的参数api,所以你必须检查它 end ``
【解决方案2】:

Boolean is true/false,你不能有nilnil 被视为假):

在计算机科学中,布尔数据类型是一种数据类型,具有两个值(通常表示为真和假)。 [[如果不为真,则为假]]

enum 会更好:

#app/models/model.rb
class Model < ActiveRecord::Base
   enum attendee: [:yes, :no, :maybe]
end

这比使用boolean 略显臃肿,但保留了data integrity(您必须破解Rails 布尔值才能将nil 识别为maybe)。 Enum 列是integers,每个enum 由一个数字表示...

yes = 0

no = 1

maybe = 2

这样,您可以执行以下操作:

= f.input :attendee, as: :radio, collection: Model.attendees, :label => "Attendence:"

【讨论】:

  • 无论好坏,如果添加布尔类型的列,默认情况下通常会接受空值。
  • 我必须明确设置默认值,因为 Rails 使用 null 值表现得很奇怪。具体忘记了
最近更新 更多