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 .