2013-03-11 21 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

相關問題