Как получить доступ к переменной, которая была создана в транзакции? - PullRequest
0 голосов
/ 19 декабря 2018

Я использую рельсы 4.2

У меня есть два вызова БД, которые должны существовать ИЛИ оба не существуют, поэтому для этого я использую транзакции внутри метода.Я также хочу, чтобы создаваемая мной переменная была доступна другим местам того же метода.Мне просто нужно использовать переменную экземпляра вместо локальной переменной?(для этого я использую puts в качестве примера другого кода, код, который я планирую выполнить, гораздо сложнее).

def method_name
  ActiveRecord::Base.transaction do
    record = another_method(1)
    another_method(record)
  end
  puts record.id
end

Если я запускаю этот код, он выдает следующее:

undefined local variable or method `record' for #<Class:...>

, но изменение record на @record облегчит это.Это действительно лучший вариант?Или есть лучший / более элегантный способ?

1 Ответ

0 голосов
/ 19 декабря 2018

Объявите record в области действия метода:

def method_name
  record = nil # ⇐ THIS

  ActiveRecord::Base.transaction do
    record = another_method(1)
  end
  puts record.id #⇒ ID or NoMethodError if `another_method` did not succeed
end

Вообще говоря, этот подход является запахом кода и запрещен в большинстве современных языков (где внутренний record будет закрыт ивнешние остаются без изменений.) Правильный подход, вероятно, состоит в том, чтобы transaction вернуть значение и присвоить его записи:

def method_name
  record, another_record =
    ActiveRecord::Base.transaction do
      [another_method(1), another_method(2)]
    end
  puts record.id if record
end
...