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

所以,两个问题:

  • 如何完成该r = [access object using left_operand_object]行,以允许我根据字符串中的名称访问作用域对象left_operand_object
  • instance_variable_get如果left_operand是类似的东西会起作用customers.count还是只有在没有计数方法的情况下才会起作用?

非常感谢任何帮助!

4

1 回答 1

1

我理解正确吗,left_operand_object会是这样的"Customer"吗?

如果是这样,您可以使用left_operand_object.constantize来获取您的Customer课程。
可能更安全地运行left_operand_object.classify.constantize,所以"row_entry"会变得RowEntry

我不太清楚你的第二个问题是关于什么的。如果你想调用该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 回答