1

我有一个包含交易列表的交易控制器,我希望每笔交易都有 3 个单选按钮来在“赢、输、待处理”之间切换。为了实现这一目标,最好的方法是什么?

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

_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,但单选按钮值除外。

4

1 回答 1

0

听起来像状态列是您正在寻找的。如果您添加几个布尔列,您将有重复的数据,因为交易不能在任何时候处于给定状态中的 2 个(不可能同时赢和输)。查看状态机。你可以用状态机做更高级的事情。

尽管我强烈推荐它,但您不需要状态机。您可以在state您的deals-table 中添加一个字符串列,并使用该列来跟踪每笔交易的状态。

$ 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
于 2013-08-05T10:15:55.347 回答