Como gerar ActiveRecord insert SQL

Eu vim com isso há um tempo em resposta a uma pergunta feita no Twitter. Acabei de encontrá-lo depois de ser questionado de novo, mas nunca tive um uso para ele.

Isso fornecerá a INSERTinstrução SQL gerada pelo ActiveRecord para os valores de atributo definidos na instância do modelo.

record = Post.new(:title => 'Yay', :body => 'This is some insert SQL')

# easiest way to achieve this is by calling protected method
# +arel_attributes_values+ (tested in rails 3.2.13). the alternative
# is to build the entire insert statement using arel >_>
record
.class.arel_table.create_insert
.tap { |im| im.insert(record.send(:arel_attributes_values, false)) }
.to_sql

Veja o Gist original aqui .

Atualizar

Foi apontado que o código acima não funciona no Rails 4.0 e posterior – o arel_attributes_valuesmétodo foi removido. Essa era uma dica antiga e, afinal, abusava de um método protegido (embora eu ache que o significado disso varia muito ao lidar com Rails).

Você pode usar em seu arel_attributes_with_values_for_createlugar:

record = Post.new(:title => 'Yay', :body => 'This is some insert SQL')

record
.class.arel_table.create_insert
.tap { |im| im.insert(record.send(
:arel_attributes_with_values_for_create,
record
.attribute_names)) }
.to_sql