write_attribute適用例


プロジェクトにはこのような2つのニーズがあります.
    1. フォームは1つのパラメータを表示して提出して、このパラメータの単位はMHZで、しかしプログラムの中で精度の要求は比較的に高いのはHZで、つまり保存する時10 e 5に乗って、フォームの表示の時、入力の時、すべてその6つのゼロを要りません.
    2. 単位換算をサポートします.たとえば、1つのプロジェクトに料金オプションがあり、為替レートの状況に応じてドルまたはRMBが表示されます.明らかに、為替レートは変化しており、フォームの提出時には、ドルを入力する可能性があり、RMBを入力する可能性があります.これはユーザーの設定によって異なります.
私たちの使い方は次のとおりです.
モデルに追加する方法:
  def noise_floor_high_disp=(x)
     #        nf_high
     write_attribute(:nf_high,(x.to_f*1_000_000).to_i)
  end

  def noise_floor_high_disp()
    if nf_high.nil?
      return nil
    else
      return read_attribute(:nf_high)/1000000.0
    end
  end

フォームでの変更方法は次のとおりです.
   
<td><%= text_field 'analyzer', :noise_floor_high_disp,  %></td>

何もないように見えますが、controllerやviewerであまり修正しなくてもいいというメリットがあります.
それを為替レートで換算しないと、私は前に次のように処理します.
viewer:

 #            ,         RMB
  <%unit_diff=ConfigParam.find(67).val.to_i==1 ? @us : @rmb

  att = @analyzer.attenuator.nil? ? nil : @analyzer.attenuator+unit_diff

  %> #      
  <tr>
    <td><label for="attenuation">Attenuation(<%=unit_diff==0 ? "RMB" : "$"%>)</label></td>
    <td><%= text_field 'analyzer','attenuator',{:size=>3,:value=>att}  %></td>
  </tr>

Cotrollerではそれぞれ、作成と修正を2回処理します
  def analyzer_create
    if params[:analyzer][:site_id].to_i == 0
    #else
    #  raise params[:analyzer].inspect()
    end
    
    @analyzer = Analyzer.new(params[:analyzer])
	@site= Site.new(params[:site])
    @analyzer.status = 10
    if @analyzer.save
	  unit_diff=ConfigParam.find(67).val.to_i==1 ? -60 : 0
	  @analyzer.update_attributes(:attenuator=>"#{params[:analyzer][:attenuator].to_i+unit_diff}") unless params[:analyzer][:attenuator].nil? or params[:analyzer][:attenuator].blank?
	  	  @analyzer.update_attributes(:nf_low=>"#{params[:analyzer][:nf_low].to_i+unit_diff}") unless params[:analyzer][:nf_low].nil? or params[:analyzer][:nf_low].blank?	  
		  @analyzer.update_attributes(:nf_high=>"#{params[:analyzer][:nf_high].to_i+unit_diff}") unless params[:analyzer][:nf_high].nil? or params[:analyzer][:nf_high].blank?
  def analyzer_update
    @analyzer = Analyzer.find(params[:id])
	@[email protected]
    if @analyzer.site_id.to_i == 0
      logger.debug("handling site");
      site_id = Site.create_if_needed(params[:site][:name])
      params[:analyzer][:site_id]=site_id
    end
	#make sure when user stop auto_connect. we can handle
    if @analyzer.auto_mode !=3 and @analyzer.att_count < 9
	  @analyzer.update_attribute(:att_count,-1)
	end
    if @analyzer.update_attributes(params[:analyzer])
	  unit_diff=ConfigParam.find(67).val.to_i==1 ? -60 : 0
	  @analyzer.update_attributes(:attenuator=>"#{params[:analyzer][:attenuator].to_i+unit_diff}") unless params[:analyzer][:attenuator].nil? || params[:analyzer][:attenuator].blank?