Я хочу получить object_id, созданный работником - PullRequest
0 голосов
/ 25 сентября 2019

Я создаю систему очередей для моего приложения rails, чтобы создать объект

в файле conreoller.rb

  def create
  object = CreateApplicationJob.perform_later
   end

в файле CreateApplicationJob.rb

def perform(*args)  
     = Object.create!(name: params[:name])
end

Я хочу получить созданный object.id

1 Ответ

2 голосов
/ 25 сентября 2019

Вы используете очередь, поэтому объект не будет создан до тех пор, пока задание не будет обработано.

Очередь лучше всего использовать для процессов, которые не зависят от времени (отправка пакета электронных писем,обновление данных из внешнего API и т. д.);в этом случае звучит так, как будто вы хотите, чтобы объект был доступен немедленно, и в этом случае очередь не подходит:

def create
  object = Object.create!(name: params[:name])
  # object.id => 3
end

Судя по вашим комментариям, вы обеспокоены тем, что условия гонки приводят к появлению названия.не быть уникальным.В этом случае вы захотите использовать ограничение уникальности в базе данных.Это можно добавить с помощью миграции, используя следующий вызов:

add_index :objects, :name, unique: true

Вы также можете использовать блокировку таблиц, но Rails не предоставляет API для этого, поэтому вам придется использовать сырой SQL.


Примечание: я предполагаю, что вы просто используете Object в качестве заполнителя для названия вашей модели, но на всякий случай: Object является корнем по умолчанию для всех объектов Ruby, поэтому выне следует переопределять его как модель ActiveRecord.

...