数字の後の文字は、キャストしたいタイプを表しています。この場合、integer
。f
forfloat
またはs
forの場合もあります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
より良い解決策を見つけたら、私に知らせてください:-)