2

Rails 3.2.6でアクティブレコードを備えたmysql2アダプターを使用しています

生の挿入中にバインド変数を使用したいと思います。選択に挿入を行っているため、通常のモデルを使用できません。

何かのようなもの:

insert into t(col1, col2)
select ?, c
from t1
where t1.x = ?

私は Rails に不慣れで、これを行うのがいかに難しいかに驚きました。これは、Model クラスなどを使用する通常の Rails 規則ではないことを理解しています。パフォーマンスとセキュリティ上の理由から、バインド変数を使用したいと考えています。理想的には、 How to execute a raw update sql with dynamic binding in rails で指定されているように raw_connection を使用したくない

4

1 に答える 1

1

これを試して:

query = <<-SQL
insert into t(col1, col2)
select ?, c
from t1
where t1.x = ?
SQL

col1 = Model.columns.find{|x| x.name == 'col1'}
col2 = Model.columns.find{|x| x.name == 'col2'}

ActiveRecord::Base.connection.insert(query, nil, nil, nil, nil, [[col1, col1_value], [col2, col2_value]])

バインドの作成方法に関する私のソース: https://github.com/rails/rails/blob/master/activerecord/test/cases/bind_parameter_test.rb

挿入方法の私の情報源: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-insert

于 2012-07-23T11:56:55.920 に答える