

Rails の find_by_sql を用いて  
`SomeModel.find_by_sql(["SELECT 1 FROM ip_addrs WHERE ip_addr = ':FFFF' AND id
= :id", {id: 1}])`  
といった、SQL内にコロンを含む、かつ、パラメータ名の置換を行うケースを実行したいのですが、SQL内のコロンが置換とみなされてしまいエラーが発生してしまいます

通常のコロンと、置換のためのコロンを区別するようなエスケープの方法は提供されていないのでしょうか？


CC BY-SA 4.0
2021-02-26T07:09:42.380
74285
2021-03-02T03:38:00.970
9796
question
ruby-on-rails ruby
Rails の find_by_sql でコロン（：）を利用する方法

[code]

    SomeModel.find_by_sql(["SELECT 1 FROM ip_addrs WHERE ip_addr = CONCAT(':', 'FFFF') AND id = :id", {id: 1}])
    
[/code]

のように SQL 層での文字列連結文法に書き換えることで、コロンの直後に [a-zA-Z] が出現することを回避できます  
ActiveRecord::Sanitization::ClassMethods.replace_named_bind_variables
の正規表現にマッチしなくなるため、SQLの文字列中のコロンを rails による破壊から保護することができます


CC BY-SA 4.0
2021-03-02T03:38:00.970
74353
2021-03-02T03:38:00.970
9796
74285
answer