2016-07-29 97 views
0

我上循環的代碼塊,每次增加變量「filter_index」,從1到2,3 ...等紅寶石:字符串插值期間字符串轉換爲符號

我想使用這個變量來訪問不同的符號:

filter1_field_name, filter2_field_name, filter3_field_name

@filter1_field_name = "Region" 
@filter2_field_name = "Country" 
@filter3_field_name = "City" 

SELECT_STATEMENT = "GROUP BY " 

numberOfFilters = 3 

filter_index = 1 
numberOfFilters.times do #Number of iterations 
    filter_field_name = "@filter#{filter_index.to_s}_field_name" 
    SELECT_STATEMENT.sub! "GROUP BY", "AND #{filter_field_name.to_sym} GROUP BY" 
    filter_index += 1 
end 

puts SELECT_STATEMENT 

這導致

和@ filter1_field_name和@ filter2_field_name和 @ filter3_field_name GROUP BY

但期望的結果是

及地區和國家及城市GROUP BY

我想知道爲什麼filter_field_name.to_sym不工作(或者說,我做錯了什麼)?

+0

所提供的答案將做你想做的。但是,我建議你考慮將過濾器存儲在一個數組中,其中數組的第0項是第一個過濾器,第1項將是第2個過濾器,依此類推。 – BrunoFacca

+0

'.to_s'可以作爲插值刪除('#{}')已經在隱式執行。 – cremno

+0

@cremno - 謝謝! –

回答

1

您可以使用instance_variable_get函數來獲取變量值。

替換行

filter_field_name = "@filter#{filter_index.to_s}_field_name" 

filter_field_name = instance_variable_get("@filter#{filter_index.to_s}_field_name") 

編輯:

我想你可以把字段名到一個數組中,並與join方法Concat的值。

fields = ['Region','Country','City'] 
fields.join(' AND ') 
+0

謝謝,完美。學到了別的東西! –

+0

'.to_s'是不必要的。 –

0

可以使用instance_variable_geteval

filter_field_name = instance_variable_get("@filter#{filter_index.to_s}_field_name") 

filter_field_name = eval("@filter#{filter_index.to_s}_field_name")