0

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

从表中检索活动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) ?

谢谢您的帮助。

4

2 回答 2

2

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

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

请注意,instance_eval在用户输入的字符串上运行对于应用程序的安全性和健康来说可能是灾难性的。小心使用,并坚持构建一个实际的哈希值。

于 2013-03-11T14:17:01.660 回答
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

于 2013-03-14T21:28:10.367 回答