1 Вопрос: «Транзакция делать» без явного получателя

вопрос создан в Wed, May 8, 2019 12:00 AM

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

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

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

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

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

    
0
  1. Да, ваше предположение верно и соответствует варианту 5, представленному чуть выше.
    2019-05-08 15: 57: 05Z
  2. Документы на самом деле не указывают, есть ли разница между model.transaction и model.class.transaction. Возможно, метод экземпляра является просто прокси для метода класса.
    2019-05-08 16: 35: 42Z
  3. @ max Это именно то, чем является метод экземпляра def transaction(options = {}, &block); self.class.transaction(options,&block); end Источник
    2019-05-08 17: 25: 07Z
1 ответ                              1                         

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

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

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

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

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);
0
2019-05-08 17: 44: 59Z
источник размещен Вот