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 INSERT
instruçã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_values
mé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_create
lugar:
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