Supose我有一个名为Classroom
的类,还有一个名叫Student
的类。根据他们的关系,我可以使用返回学生数组的Classroom.students
访问Student。
现在,考虑到这一点,如果我将'Classroom'
分配给一个变量并用variable.constantize
调用它,它将返回我可以正常查询的Class。
例如:
[1] pry(main)> variable = 'Classroom'
[2] pry(main)> variable.constantize.students
=> [#<Student id: 1, name: 'Foo Smith'>, <Student id: 2, name: 'Bar Obama'>]
所有这些对我来说都有效,但如果密钥名称也存储为字符串,我不知道如何访问学生。如果我试图访问Classroom
字段,这是有效的,但对于关系来说,这似乎是不可能的。
例如:
[1] pry(main)> variable = 'Classroom'
[2] pry(main)> class_key = 'name'
[3] pry(main)> relation_key = 'students'
[4] pry(main)> variable.constantize.first[class_key]
=> "Happy Classroom"
[5] pry(main)> variable.constantize.first[key]
=> nil
还有另一种情况,字符串是类中的一个方法。
我想做的(模拟代码(:
[1] pry(main)> variable = 'Classroom'
[2] pry(main)> method = 'last'
[3] pry(main)> variable.constantize[method]
=> <#Classroom id: 3, name: 'Dubious Classroom'>
其中任何一个在Ruby中都可行?谢谢
使用Object.public_send,如下所示:
'Classroom'.constantize.public_send('students').public_send('first')
编辑:原始答案建议使用send
而不是public_send
。不同的是,前者甚至会调用私有方法,因此使用起来不如后者安全。