2013-07-23 85 views
0

我正在寫一個插入一個選擇:如何動態更改常量賦值?

my_object_id = 7 
id_list = [1,2,4,5] 

TEST_TEMPLATE = %Q{ 
     INSERT INTO tests 
     (test_id, data_id, text, created_at, updated_at) 
     select #{my_object_id}, data_id, text, created_at, updated_at 
     from tests where id in (#{id_list}) 
    } 

ActiveRecord::Base.connection.execute(TEST_TEMPLATE); 

我得到的錯誤,我不能改變常數。如何將值注入到字符串中,以便在插入/選擇語句中使用它?

這怎麼能在Ruby中解決?

+2

哪行代碼會產生錯誤?我沒有看到你上面寫的東西有什麼問題。 – lurker

+2

也許這是遺留代碼,你無法提供幫助,但不應該從模板生成原始SQL並使用ActiveRecord執行它。 ActiveRecord的要點是抽象SQL,提供像自動轉義一樣的好處來防止SQL注入。 –

回答

1

沒有理由讓它成爲一個常數。

my_object_id = 7 
id_list = [1,2,4,5] 

test_template = %Q{ 
     INSERT INTO tests 
     (test_id, data_id, text, created_at, updated_at) 
     select #{my_object_id}, data_id, text, created_at, updated_at 
     from tests where id in (#{id_list}) 
    } 

ActiveRecord::Base.connection.execute(test_template) 
2

這裏有一點的解釋@SergioTulentsev答案:

你應該改變的TEST_TEMPLATE的第一個字母爲小寫,因爲開頭大寫字母變量實際上不是變量,它們是常數,所以你不應該改變它們。

由於@SergioTulentsev在他的代碼中顯示,您應該將每個字母更改爲小寫以匹配Ruby中使用的樣式約定。

+0

其實,你可以在Ruby中改變常量。你只是得到一個警告。 –

+0

這樣做的風格很糟糕,這就是我們得到警告的原因。 –

+1

[Ruby風格指南](https://github.com/bbatsov/ruby-style-guide)值得多次閱讀。 –