Help us understand the problem. What is going on with this article?

Rails で宣言的トランザクション #ginzarb

More than 3 years have passed since last update.

ぎんざRuby会議01 で宣言的トランザクションの話になって、 @a_matsuda さんが Rails にも宣言的トランザクション欲しくない?的なことを言っていたので gem でサクッと作ってみました。

https://github.com/ttanimichi/transactional

宣言的トランザクションとは

宣言的トランザクションとは、あるメソッドが呼び出された時に自動的にトランザクションをかける、ということを宣言的に記述する手法のことです。実装しているフレームワークとしては Java の Spring Framework が有名です。Spring Framework の場合、メソッドに @Transactional というアノテーションを付与することで宣言的トランザクションを使用することができます。

@Transactional
public void create(int id) {
    // do something
}

使い方

Gemfile に追加して bundle install してください。

gem 'transactional'

あとは Controller でトランザクションをかけたい action を transactional に指定するだけです。

class YourController < ApplicationController
+  transactional :create, :update
+
  def index
  end

  def create
    Post.create!(name: 'john', age: 42)
    Topic.create!(title: 'invalid title')
    render plain: :created
  end

  def update
  end
end

とすると、指定した action が呼ばれたときに自動的にトランザクションがかかります。

Processing by YourController#create as HTML
   (0.2ms)  BEGIN
  SQL (0.5ms)  INSERT INTO "posts" ("name", "age", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["name", "john"], ["age", 42], ["created_at", "2017-08-06 08:23:13.980493"], ["updated_at", "2017-08-06 08:23:13.980493"]]
   (0.2ms)  ROLLBACK

この例では Topic の create! で例外を吐いた際に posts の INSERT がロールバックされているのが分かります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away