我试图根据包含对象名称的字符串来访问对象。该对象是作用域的(我使用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
会有效吗?或者只有在没有计数方法的情况下才会有效吗?任何帮助都非常感谢!
答案 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 }
为这个特殊情况做了诀窍。