我创建了一个医生导入程序,但是我想先运行并完成一些方法,例如创建新的办公室等,然后再更新该医生的数据。它们在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
我希望在运行更新方法之前先运行并完成创建和映射方法。
答案 0 :(得分:4)
Ruby将按照调用它们的顺序运行这些方法。 Ruby默认不是异步的。但是在Rails中很常见,建议使用异步后台作业。有关如何进行设置的想法,请参见documentation。
此外,在运行方法内部查看一长串方法时,我不知道它们的作用,只能推测可能存在一些复杂的业务逻辑。您可能还想看看这个article on interactors in rails,在这种情况下可能是有用的设计模式。另请参阅以下相关的宝石,interactor和activeinteractor
答案 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函数按调用顺序运行。