ruby-on-rails - 如何在 Ruby on Rails 中使用字符串访问实例关系?
问题描述
假设我有一个名为的类Classroom
,而我还有另一个名为Student
. 从他们的关系中,我可以通过使用Classroom.students
which 返回一组学生来访问 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中是可行的吗?谢谢!
解决方案
使用Object.public_send,如下所示:
'Classroom'.constantize.public_send('students').public_send('first')
编辑:建议使用原始答案send
而不是public_send
. 不同之处在于前者甚至会调用私有方法,因此使用起来不如后者安全。
推荐阅读
- java - 无法自动选择文件通过使用 Selenium Webdriver
- python - Python 在函数中使用 [0] 传递变量
- c++ - 混合 C++ 和程序集不能将多个参数从 C++ 函数传递到程序集
- python-3.x - 在工作人员之间发送 Aiohttp Websocket 消息
- ios - 如何快速使用 Microsoft Speech API:iOS Speech-to-Text 客户端库?
- python - 每次在python中调用函数时在函数内循环一个变量
- swift - ios中单个金属层中的多个纹理
- javascript - 是否可以在电子应用程序中从相机流式传输 RTSP(实时)视频?
- sql-server - MultiSubnetFailover 不适用于 Windows 中的 ODBC13/17
- powershell - 409:使用 REST API 在 Artifactory 中复制工件时发生冲突错误