Rails从包含对象名称的字符串访问对象

时间:2012-07-01 20:01:33

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我试图根据包含对象名称的字符串来访问对象。该对象是作用域的(我使用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会有效吗?或者只有在没有计数方法的情况下才会有效吗?

任何帮助都非常感谢!

1 个答案:

答案 0 :(得分: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 }为这个特殊情况做了诀窍。