我有一个交易控制器,其中包含一系列交易,我希望每笔交易都有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,但单选按钮值除外。
答案 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