Ruby on rails Ruby/Rails worker创建或更新记录(如果存在)-避免干燥

Ruby on rails Ruby/Rails worker创建或更新记录(如果存在)-避免干燥,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个工人来存储来自传入Webhook的数据。现在,如果现有数据已经存在,我想使用这个worker来更新现有数据 class StoreActivityWorker include Sidekiq::Worker def perform(webhook) Activity.create!( cms_activity_id: webhook.dig('entity', 'id').to_i, is_separate_activity: webhook.d

我有一个工人来存储来自传入Webhook的数据。现在,如果现有数据已经存在,我想使用这个worker来更新现有数据

class StoreActivityWorker
  include Sidekiq::Worker

  def perform(webhook)
    Activity.create!(
      cms_activity_id: webhook.dig('entity', 'id').to_i,
      is_separate_activity: webhook.dig('entity', 'attributes', 'is_separate_activity'),
      content_full: retrieve_full_content(webhook),
      content_basic: retrieve_basic_content(webhook),
    )
  end
end
由于webhook不显示哪些记录已更新,
UpdateActivityWorker
将保持相同(更新所有字段):

正如你所看到的,它不是干的。有没有办法避免重复该代码?

看一下方法:

class UpdateActivityWorker
  include Sidekiq::Worker

  def perform(webhook)
    Activity.where(cms_activity_id: webhook[:entity][:id]).update(
      cms_activity_id: webhook.dig('entity', 'id').to_i,
      is_separate_activity: webhook.dig('entity', 'attributes', 'is_separate_activity'),
      content_full: retrieve_full_content(webhook),
      content_basic: retrieve_basic_content(webhook),
    )
  end
end
class StoreActivityWorker
  include Sidekiq::Worker

  def perform(webhook)
    entity = webhook.dig 'entity'

    activity = Activity.find_or_initialize_by(cms_activity_id: entity['id'])

    activity.update!(
      is_separate_activity: entity.dig('attributes', 'is_separate_activity'),
      content_full: retrieve_full_content(webhook),
      content_basic: retrieve_basic_content(webhook),
    )
  end
end