使用表单中的单选按钮来更新数据库

时间:2013-08-05 08:44:54

标签: ruby-on-rails-3 radio-button boolean

我有一个交易控制器,其中包含一系列交易,我希望每笔交易都有3个单选按钮,可以在“赢了,丢失​​,待定”之间切换。为实现这一目标,最好的方法是什么?

我有几个选项,要么在类型为boolean的deals表中创建新条目,要么创建一个连接到deals表的不同表,其中一个外键具有每个选项的布尔值。 我有点困惑..

_deal_status.html.erb

<%= form_for @deal do |f| %>

  State:
  <label>
    <%= f.radio_button :state, 'pending', :class => "radio" %>
    Pending
  </label>
  <label>
    <%= f.radio_button :state, 'won', :class => "radio" %>
    Won
  </label>
  <label>
    <%= f.radio_button :state, 'lost', :class => "radio" %>
    Lost
  </label>

<% end %>

此表格将原始的@deal格式重置为nil,但单选按钮值除外。

1 个答案:

答案 0 :(得分:0)

听起来像州列是您正在寻找的。如果你添加几个布尔列,你就会有重复的数据,因为交易在任何时候都不能处于给定状态中的2个(同时赢得和丢失是不可能的)。看看State Machines。你可以用状态机做更高级的东西。

虽然我强烈推荐它,但你不需要状态机。您只需将字符串列state添加到deals - 表中,然后使用该列跟踪每笔交易的状态。

$ rails g migration add_state_to_deals state:string

要获取表单中的单选按钮,您可以执行以下操作:

<%= form_for @deal do |f| %>
  ...
  State:
  <label>
    <%= f.radio_button :state, 'pending' %>
    Pending
  </label>
  <label>
    <%= f.radio_button :state, 'won' %>
    Won
  </label>
  <label>
    <%= f.radio_button :state, 'lost' %>
    Lost
  </label>
  ...
<% end %>

在您的模型中使用此验证和默认值设置器:

class Deal < ActiveRecord::Base
  ...
  validates_inclusion_of :state, in: %w{pending won lost}
  after_initialize :set_default_state, if: :new_record?

  private

  def set_default_state
    state = 'pending'
  end
  ...
end