依次运行红宝石方法

时间:2019-06-21 15:44:30

标签: ruby ruby-on-rails-5

我创建了一个医生导入程序,但是我想先运行并完成一些方法,例如创建新的办公室等,然后再更新该医生的数据。它们在run方法上是否同时运行?还是一次只能运行一种方法?

红宝石

  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

我希望在运行更新方法之前先运行并完成创建和映射方法。

3 个答案:

答案 0 :(得分:4)

Ruby将按照调用它们的顺序运行这些方法。 Ruby默认不是异步的。但是在Rails中很常见,建议使用异步后台作业。有关如何进行设置的想法,请参见documentation

此外,在运行方法内部查看一长串方法时,我不知道它们的作用,只能推测可能存在一些复杂的业务逻辑。您可能还想看看这个article on interactors in rails,在这种情况下可能是有用的设计模式。另请参阅以下相关的宝石,interactoractiveinteractor

答案 1 :(得分:1)

它们将顺序运行。您可以产生多个线程并同时启动它们,但是请记住,Ruby具有GIL,因此只有其中一些函数进行Web调用或其他O / I操作时,它才会对您有利。

如果您决定要这样做,可以使用Concurrent Ruby之类的库来简化它。 https://github.com/ruby-concurrency/concurrent-ruby

答案 2 :(得分:1)

如果您是在 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

请参阅有关HERE方式的更多详细信息,它将大大有助于使代码干燥。您还可以通过将它们定义为方法来覆盖这些回调,以便在需要时将其扩展为您的期望。

Ruby函数按调用顺序运行。