0

オブジェクトの名前を含む文字列に基づいてオブジェクトにアクセスしようとしています。オブジェクトのスコープが設定されています(ユーザーがアクセスを許可されているレコードにのみアクセスできるようにするために、cancanを使用しています)。私は私がしなければならないところにいくつかのコードを以下に含めました:

operation_type:string, one of %w(add sub mult div)
left_operand_object:string
left_operand:string
right_operand_object:string
right_operand:string


def result
    r = [access object using left_operand_object]
    k = [access object using right_operand_object]

    if operation_type == 'add'
        r.instance_variable_get('@'+left_operand) + k.instance_variable_get('@'+left_operand)
    elsif operation_type == 'sub'
        r.instance_variable_get('@'+left_operand) - k.instance_variable_get('@'+left_operand)
    ...
end

したがって、2つの質問:

  • r = [access object using left_operand_object]文字列からの名前に基づいてスコープオブジェクトにアクセスできるようにするには、どうすれば行を完成させることができますleft_operand_objectか?
  • のようなものinstance_variable_getであれば機能しますか、それともcountメソッドなしでのみ機能しますか?left_operandcustomers.count

どんな助けでも大歓迎です!

4

1 に答える 1

1

私は正しく理解しましたleft_operand_object"Customer"

もしそうなら、あなたはあなたのクラスleft_operand_object.constantizeを取得するために使用することができます。 おそらく実行する方が安全なので、になります。Customer
left_operand_object.classify.constantize"row_entry"RowEntry

あなたの2番目の質問が何であるかは完全にはわかりません。メソッドを呼び出したい場合は、次のcountようにすることができますr.send(left_operand.to_sym)( `left_operand =" count "と仮定)。

left_operandが「sales.count」のようなものである場合、これは機能しません。それを行うための慣用的な方法があるかどうかはわかりませんが、left_operand.split(".").inject(r) { |a, b| a.send b }この特定の場合のトリックを行います。


于 2012-07-01T22:31:47.257 に答える