对于我的第一个Rails项目,我正在尝试使用SimpleForm gem创建一个表单。表格中有单选按钮格式的问题,每个答案都有一个与之相关的分数(1-4)。我的目的是让表格将每个问题的分数(:vision_problems,:balance_issues,:nausea)相加,并在用户提交表单后将总分保存到单独的列(:total)中。解决这个问题的最佳方法是什么?
目前,我正在使用以下内容在我的“显示”视图中显示总数,但是:总列数会更好:
<%= @total = @symptom.nausea + @symptom.balance_issues + @symptom.vision_problems %>
感谢您的帮助。
视图中的表单部分:
<%= simple_form_for(@symptom) do |f| %>
<%= f.error_notification %>
<%= f.input :vision_problems, label_html: { class: "buttonhead" }, collection: [ 1 , 2, 3,
4 ], as: :radio_buttons %>
<%= f.input :balance_issues, label_html: { class: "buttonhead" }, collection: [ 1 , 2, 3,
4 ], as: :radio_buttons %>
<%= f.input :nausea, label_html: { class: "label label-info" }, collection: [ 1 , 2, 3,
4 ], as: :radio_buttons %>
<%= f.button :submit, class: "btn btn-primary" %>
<% end %>
症状模型:
class Symptom < ActiveRecord::Base
attr_accessible :description, :vision_problems, :balance_issues, :nausea, :user_id, :total
belongs_to :user
validates :user_id, presence: true
end
症状控制器的创建部分:
def create
@symptom = current_user.Symptoms.new(params[:symptom])
respond_to do |format|
if @symptom.save
format.html { redirect_to @symptom, notice: 'Symptom was successfully created.' }
format.json { render json: @symptom, status: :created, location: @symptom }
else
format.html { render action: "new" }
format.json { render json: @symptom.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:0)
您可以使用回调来在保存对象时生成总计。
照常添加总列
add_column :symptoms, :total, :integer
向症状模型添加回调:
before_validation :update_total
def update_total
total = nausea + balance_issues + vision_problems
end
在决定回调链中您希望发生这种情况的位置时,有几个选项可供选择。
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
答案 1 :(得分:0)
直接解决方案(如果我理解你要求的话)是在保存之前在控制器的total
方法中设置create
属性;即添加行
@symptom.total = @symptom.nausea + @symptom.balance_issues +
@symptom.vision_problems
但我得到的印象是,您真正需要的是方法或虚拟属性(即,通过您自己定义的方法获取和设置的属性,而不是映射到数据库柱)。您可以将其定义为模型方法,而不是创建名为total
的表列:
class Symptom < ActiveRecord::Base
attr_accessible :description, :vision_problems, :balance_issues,
:nausea, :user_id
def total
nausea + balance_issues + vision_problems
end
end
然后,当您使用@symptom.total
时,您正在动态添加其他属性。缺点是您无法直接操纵总计的值(例如,您不能说@symptom.total += 1
),但这是您可能永远不想做的事情(或者甚至可能主动阻止)。