首页 > 解决方案 > 如何在 Ruby on Rails 中使用字符串访问实例关系?

问题描述

假设我有一个名为的类Classroom,而我还有另一个名为Student. 从他们的关系中,我可以通过使用Classroom.studentswhich 返回一组学生来访问 Student。

现在,考虑到这一点,如果我分配'Classroom'给一个变量并用variable.constantize它调用它将返回我可以正常查询的类。

例如:

[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中是可行的吗?谢谢!

标签: ruby-on-railsrubyabstract

解决方案


使用Object.public_send,如下所示:

'Classroom'.constantize.public_send('students').public_send('first')

编辑:建议使用原始答案send而不是public_send. 不同之处在于前者甚至会调用私有方法,因此使用起来不如后者安全。


推荐阅读