2013-03-11 194 views
0

我们希望在db中存储两个rails查询字符串和表名,并在运行时检索它们以便执行。下面是这种情况:如何使用rails 3.2.12中的字符串变量进行查询?

customers表中检索积极customer记录。比方说,我们有2个变量定义为:

table_name = 'Customer' 
query_string = ':active => true' 

在轨,查询可能是:

records = Customer.where(:active => true) 
与表名和存储在变量表名和QUERY_STRING查询字符串

现在,是有可能装配一个包含2个变量的查询字符串:

records = table_name.where(query_string) ? 

感谢您的帮助。

回答

2

您可以这样做,但通常不建议将字符串评估为散列。此外,table_name是变量的一个不幸的名字,因为您实际上正在存储类名(表为'customers')。在任何情况下,你缺少的是这些字符串的EVAL:

records = class_name.constantize.where(instance_eval(query_string)) 

注意,在用户输入的字符串运行instance_eval可以灾难性的安全性和应用程序的福祉。小心使用,并坚持建立一个实际的散列。

+0

is class_name ='Customer'in your answer?该字符串将从只读数据表中提取。如果数据表通常是安全的,那么这种编码实践还有其他风险吗? – user938363 2013-03-11 14:37:39

+0

@ user938363:是的,'class_name ='Customer''。这个查询数据如何进入数据表?你想完成什么,你不能用范围和类方法做?对于拥有更优雅和可预测的解决方案的东西来说,这似乎是一种草率和难以维护的方法。 – PinnyM 2013-03-11 14:42:44

+0

我们正在设计一个访问控制,并想描述访问并将其保存到表中。数据保存在数据加载过程中,只需更改入职数据,就可以灵活地适应未来的变化。我们的目的是避免数据驱动的代码更改。 – user938363 2013-03-11 16:45:19

1

instance_eval的定义是:Evaluates a string containing Ruby source code, or the given block, within the context of the receiver (obj).

另一种方式来EVAL查询字符串包括where在字符串中,如:

table_name = 'Customer' 
query_string = 'where(:active => true)' 

则记录可以通过检索

records = table_name.constantize.instance_eval(query_string) 

通过将where放入字符串中,我们可以使用instance_eval的全部功能而不是jus如上面的问题那样将源代码返回到where

相关问题