Запускайте методы ruby ​​один за другим - PullRequest
1 голос
/ 21 июня 2019

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

ruby ​​

  def run
    # Create all of our dependencies
    create_hospitals
    create_departments
    create_specialties
    create_offices

    # Map the dependencies to each doctor
    map_hospitals
    map_departments
    map_specialties
    map_offices

    # Save the mapped data, then traverse and create doctors that don't exist
    @record.save
    update_doctors  # Update existing physicians
    create_doctors  # Create new physicians

    # Update the record status
    @record.import_log.empty? ? @record.completed! : @record.failed!
  end

Я хочу, чтобы первые методы create и map выполнялись и заканчивались до запуска методов обновления.

Ответы [ 3 ]

4 голосов
/ 21 июня 2019

Ruby будет запускать методы в порядке их вызова.По умолчанию Ruby не является асинхронным.Однако в Rails распространено и рекомендуется использовать асинхронные фоновые задания.См. документацию для идей о том, как это настроить.

Кроме того, глядя на длинный список методов, которые вы запускаете внутри своего метода run, не зная, что они делают, я могутолько предположить, что там может быть какая-то сложная бизнес-логика.Возможно, вы также захотите взглянуть на эту статью об интеракторах в rails , которая может быть полезной схемой проектирования в таких случаях.Также смотрите следующие связанные драгоценные камни, интерактор и activeinteractor

1 голос
/ 21 июня 2019

Если вы делаете это в Rails , обратные вызовы Active Record дают вам доступ к вызову всех этих методов, чтобы он мог выполняться до или после выполнения ожидаемой функции.Например:

Создание объекта

before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback

Обновление объекта

before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback

Уничтожение объекта

before_destroy
around_destroy
after_destroy
after_commit/after_rollback

Более подробная информация окак ЗДЕСЬ и это существенно поможет в подсыхании вашего кода.Вы также можете переопределить эти обратные вызовы, определив их как методы, чтобы при необходимости вы могли расширить их по своему желанию.

Функции Ruby запускаются в том порядке, в котором они вызываются.

1 голос
/ 21 июня 2019

Они будут работать последовательно. Вы можете порождать несколько потоков и запускать их одновременно, но имейте в виду, что в Ruby есть GIL , поэтому вам будет полезно только если некоторые из этих функций выполняют веб-вызовы или другие операции O / I.

Если вы решите, что хотите это сделать, вы можете использовать библиотеку вроде Concurrent Ruby, чтобы упростить эту задачу. https://github.com/ruby-concurrency/concurrent-ruby

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...