2012-05-30 71 views
4

我有串状"User.first"有没有办法到字符串转换为ActiveRecord的查询:字符串转换为ActiveRecord的查询

User.first 

此字符串可以是任何东西,我想使其可执行。

+4

显而易见的解决方法是使用'eval',但是这会带来整个安全问题。特别是因为它似乎是用户输入 - 是吗? –

+0

所以问题是,它总是“model.classmethod”?以及这个字符串来自哪里?可靠的消息来源?为什么看起来像Ruby代码而不是某种数据结构? – tokland

回答

1

kernel#eval文档:

与eval(String [,结合[,文件名[,LINENO]]])→OBJ点击展开 源代码

以字符串形式评估Ruby表达式。如果给出绑定,那么 必须是Binding对象,评估在其上下文中执行。 如果存在可选的文件名和lineno参数,则会在报告语法错误时使用 。

但是,正如@andrew-marshall正确指出的那样,如果您使用任何未经验证的输入类型,这是一个巨大的安全漏洞。请参阅Locking Ruby in the Safe作为更多关于受污染数据和$ SAFE等级信息的起点。

3

你可以用某事尝试像

Kernel.const_get("User").send('first') 
+1

这仍然需要先解析字符串,所以它没有真正解决OP的问题。 –