2013-07-23 57 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)值得多次阅读。 –