如何在rails 3.2.12中查询字符串变量?

时间:2013-03-11 14:12:57

标签: sql ruby ruby-on-rails-3

我们希望在db中存储rails查询字符串和表名,并检索它们以便在运行时执行。这是场景:

customer表中检索有效customers条记录。假设我们将2个变量定义为:

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

在rails中,查询可以是:

records = Customer.where(:active => true)

现在将表名和查询字符串存储在变量table_name和query_string中,是否可以使用2个变量组装查询字符串,如:

 records = table_name.where(query_string) ?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以这样做,但通常不建议将字符串计算为哈希值。此外,table_name是变量的一个不幸的名称,因为您实际上存储的是类名(表将是'customers')。无论如何,你缺少的是这些字符串的评估:

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

请注意,对用户输入的字符串运行instance_eval可能会对安全性和应用程序的健康造成灾难。小心使用,并坚持构建实际的哈希值。

答案 1 :(得分:1)

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

评估查询字符串的另一种方法是在字符串中包含where,如:

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

然后可以通过以下方式检索记录:

records = table_name.constantize.instance_eval(query_string)

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