Я пытаюсь автоматически установить created_by
в моих моделях для аутентифицированного пользователя без явной передачи пользователя в качестве аргумента. Я использую devise для аутентификации и для настройки пользователя глобально при каждом запросе. Я использую новые rails api ActiveSupport::CurrentAttributes
, например, так:
# app/models/current.rb
class Current < ActiveSupport::CurrentAttributes
attribute :user
end
# config/initializers/warden.rb
Warden::Manager.after_set_user { |user, auth, opts| Current.user = user }
Тогда у меня Owned
беспокойство
# app/models/concerns/owned.rb
module Owned
extend ActiveSupport::Concern
included do
belongs_to(
:created_by,
class_name: "User",
foreign_key: "created_by_id",
default: -> { Current.user }
)
end
end
, который включен в модели, в которых я хочу автоматически установить created_by
.
Это работает, но недавно я получил ошибку, в которой created_by
был назначен не тому человеку, и мне интересно, может ли это быть вызвано кодом, который я описал выше, потому что это не потокобезопасно. Я не могу воспроизвести ошибку снова, и я не знаю, как проверить на такие потенциальные условия гонки. Итак, мои вопросы: правильно ли я использую CurrentAttributes
и мой код в целом? Есть ли лучший способ, как автоматически установить created_by
?