【问题标题】:How do I dynamically change constant assignment?如何动态更改常量赋值?
【发布时间】:2013-07-23 22:54:26
【问题描述】:

我正在编写一个带有选择的插入:

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 中解决这个问题?

【问题讨论】:

  • 哪行代码产生了错误?我看不出你上面写的有什么问题。
  • 也许这是遗留代码,您无能为力,但您不应该从模板生成原始 SQL 并使用 ActiveRecord 执行它。 ActiveRecord的主要作用是抽象SQL,提供自动转义等好处,防止SQL注入。

标签: ruby


【解决方案1】:

以下是对@SergioTulentsev 答案的一些解释:

你应该把TEST_TEMPLATE的第一个字母改为小写,因为以大写字母开头的变量实际上并不是变量,它们是常量,所以你不应该改变它们。

正如@SergioTulentsev 在他的代码中显示的那样,您应该将每个字母更改为小写以匹配 Ruby 中使用的样式约定。

【讨论】:

  • 其实你可以在Ruby中改变常量。您只会收到有关它的警告。
  • 这样做被认为是不好的风格,这就是我们收到警告的原因。
  • The Ruby Style Guide 值得多次阅读。
  • @theTinMan 我会支持的!
【解决方案2】:

没有理由让它成为常数。

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)

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多