Знали про такую штуку?
Универсальный идентификатор для моделей, вида
gid://YourApp/Some::Model/id Основной юзкейс - замена сериализации в отложенных джобах. Будет использоваться, если вы передадите в джобу ar-объект.
Вы этого даже не увидите, но работает так:
Создаётся объект:
[3] pry(main)> gid = u.to_global_id
=> #<GlobalID:0x000074a394a41f58 @uri=#<URI::GID gid://practical-developer/User/12>>
Вместо десериализации - вытащит ar-объект через find:
[15] pry(main)> GlobalID::Locator.locate gid
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 12], ["LIMIT", 1]]
=> #<User id: 12, apple_username:
find прямо прописан в геме в дефолтном локаторе, но можно написать свой (смотрите в ридми гема или в книге).
Круто, конечно, но по мне так лучше AR-объекты в джобы не передавать, а явно передать идентификатор и явно достать из бд (в стандартном случае).
Помните ещё в delayed_job можно было? Вообще не писать джобу, а сделать так:
(примеры из доки)
# without delayed_job
@user.activate!(@device)
# with delayed_job
@user.delay.activate!(@device)
Или так:
class Device
def deliver
# long running method
end
handle_asynchronously :deliver
end
device = Device.new
device.deliver
А потом ловить ошибки, что у вас уже нет соответствующих записей на момент выполнения джобы.
Это вообще зло, есть соблазн для разработчиков лепить, не думая, а потом разгребать. Как-то выпиливала всё это с девту (потом ещё саму dj)
То же и с передачей ar-объектов.
Тот случай, когда явное лучше скрытого. GlobalID, может быть, для других случаев подойдёт? Расскажите, для каких, если пользуетесь.
И в целом что думаете по поводу явного/скрытого здесь?
#layered_rails #rails
#книжный_клуб@anna_codes