«транзакция делать» без явного получателя - PullRequest
0 голосов
/ 08 мая 2019

Согласно документам, в моделях Rails транзакции выполняются либо для классов, начинающихся с ActiveRecord::Base, либо для любого экземпляра такого класса.Некоторые сообщения в блоге по этой теме содержат следующие варианты:

  • ActiveRecord::Base.transaction do
  • User.transaction do
    Пользователь спускается с ActiveRecord :: Base
  • @user.transaction do
    @ user является экземпляром User
  • self.class.transaction do
    в любом model.rb, где self, например, User
  • self.transaction do
    в любом model.rbгде self, например, экземпляр User)

Однако я упускаю еще один вариант в этом списке: как насчет transaction do в model.rb?

class User < ApplicationRecord
  def foo
    transaction do
      # do stuff
    end
  end
end

Правильно ли я предполагаю, что self. не является действительно необходимым, поскольку в области действия метода экземпляра модели self всегда является экземпляром модели по умолчанию?

1 Ответ

0 голосов
/ 08 мая 2019

В Ruby неявный получатель в методе экземпляра всегда является экземпляром:

class Thing
  def foo
    inspect
  end
end

irb(main):026:0> Thing.new.foo
=> "#<Thing:0x007fde95955828>"

Правильно ли я предполагаю, что это я. не очень нужно, так как в область применения метода экземпляра модели, self всегда модель экземпляр по умолчанию?

В ruby ​​всегда есть неявный получатель (я). Что это такое, зависит от контекста. В методах класса его класс. Его «главный» (глобальный объект), если вы не в классе или модуле.

class Foo
  inspect
end
# => "Foo"

def foo
  inspect
end
# => "main"

Вы должны явно использовать self только там, где необходимо устранить неоднозначность (как, например, self.class). Но во многих ситуациях это может помочь читабельности вашего кода.

Все вышеперечисленные параметры в значительной степени функционально эквивалентны:

  • ActiveRecord::Base.transaction подключается к БД для этой среды с database.yml или ENV["DATABASE_URL"].
  • User.transaction или class.transaction можно использовать, если вы хотите иметь разные соединения для класса модели или просто не любите печатать. Все, что он действительно делает, это connection.transaction(options, &block).
  • Уровень экземпляра self.transaction или @user.transaction просто прокси для метода класса. Все, что он действительно делает, это self.class.transaction(options,&block);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...