我们希望在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) ?
感谢您的帮助。
答案 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
。