Pular chamadas de AR

Essa velha questão ainda surge muito: eu tenho esse callback que manda e-mail, faz café e tira $ 10 do meu cartão de crédito. Estou criando este objeto em um loop em um teste e estou sem dinheiro.

Normalmente … não deveria fazer isso em callbacks, tente criar um método separado como Project.submit_and_do_stuff(attrs). Ou tente objetos de serviço.

Dito isso, você pode acessar diretamente as entranhas de persistência do ActiveRecord:

def lol_insert(record)
record
[:created_at] ||= Time.zone.now if record.respond_to?(:created_at=)
record
[:updated_at] ||= Time.zone.now if record.respond_to?(:updated_at=)
ActiveRecord::Persistence.instance_method(:create_record).bind(record).call
record

end

lol_insert
( ModelWithLottaCallbacks.new )

Isso também pula outros módulos misturados em AR :: Base, como timestamps automáticos, portanto, estamos preenchendo-os manualmente.

Truque testado em Ruby 2.1.1 e Rails 4.1.

Para atualizar o registro, AR expõe o método update_columns bacana .