4

time_selectを使用してモデルに時間を入力し、計算を実行しようとしています。

time_selectヘルパーは、Active Recordオブジェクトへのマルチパラメーター割り当てで使用できるように、返されるパラメーターを準備します。

次のようなもの

  Parameters: {"commit"=>"Calculate", "authenticity_token"=>"eQ/wixLHfrboPd/Ol5IkhQ4lENpt9vc4j0PcIw0Iy/M=", "calculator"=>{"time(2i)"=>"6", "time(3i)"=>"10", "time(4i)"=>"17", "time(5i)"=>"15", "time(1i)"=>"2009"}}

私の質問は、非アクティブなレコードモデルでこの形式を使用するための最良の方法は何ですか。サイドノートにも。(5i)、(4i)などの意味は何ですか?(異なる時間値を区別する明白な理由を除いて、基本的にそれがこのように命名された理由)

ありがとうございました

4

2 に答える 2

4

非アクティブレコードモデルで次のようにメソッドを作成できます

# This will return a Time object from provided hash
def parse_calculator_time(hash)
  Time.parse("#{hash['time1i']}-#{hash['time2i']}-#{hash['time3i']} #{hash['time4i']}:#{hash['time5i']}")
end

次に、次のようにコントローラーアクションからメソッドを呼び出すことができます。

time_object = YourModel.parse_calculator_time(params[:calculator])

最善の解決策ではないかもしれませんが、使い方は簡単です。

乾杯 :)

于 2009-06-11T03:32:29.487 に答える
2

数字の後の文字は、キャストしたいタイプを表しています。この場合、integerfforfloatまたはsforの場合もありますstring

私はこれを自分でやっただけで、見つけることができる最も簡単な方法は、基本的にRailsコードをコピーしてベースモジュール(または抽象オブジェクト)に貼り付けることでした。

次の関数を逐語的にコピーしましたActiveRecord::Base

  • assign_multiparameter_attributes(pairs)
  • extract_callstack_for_multiparameter_attributes(pairs)
  • type_cast_attribute_value(multiparameter_name, value)
  • find_parameter_position(multiparameter_name)

それらを呼び出す/使用する次のメソッドもあります。

def setup_parameters(params = {})
  new_params = {}
  multi_parameter_attributes = []

  params.each do |k,v|
    if k.to_s.include?("(")
      multi_parameter_attributes << [ k.to_s, v ]
    else
      new_params[k.to_s] = v
    end
  end

  new_params.merge(assign_multiparameter_attributes(multi_parameter_attributes))
end

# Very simplified version of the ActiveRecord::Base method that handles only dates/times
def execute_callstack_for_multiparameter_attributes(callstack)
  attributes = {}

  callstack.each do |name, values|

    if values.empty?
      send(name + '=', nil)
    else
      value = case values.size
        when 2 then t = Time.new; Time.local(t.year, t.month, t.day, values[0], values[min], 0, 0)
        when 5 then t = Time.time_with_datetime_fallback(:local, *values)
        when 3 then Date.new(*values)
        else nil
      end

      attributes[name.to_s] = value
    end

  end

  attributes
end

より良い解決策を見つけたら、私に知らせてください:-)

于 2009-06-11T00:04:38.767 に答える