0

私の最初の Rails プロジェクトでは、SimpleForm gem を使用してフォームを作成しようとしています。フォームにはラジオ ボタン形式の質問があり、各回答にはスコア (1 ~ 4) が関連付けられています。私の目的は、フォームに各質問 (:vision_problems、:balance_issues、:nausea) のスコアを合計し、ユーザーがフォームを送信すると、合計スコアを別の列 (:total) に保存することです。この問題にアプローチする最善の方法は何ですか?

現在、以下を使用して Show ビューに合計を表示していますが、: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
4

2 に答える 2

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と、その場で他の属性を追加します。欠点は、total の値を直接操作できないことです (たとえば、 を言うことはできません@symptom.total += 1)。

于 2013-05-22T21:56:50.573 に答える
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

于 2013-05-22T19:53:16.363 に答える