Я создаю Rails API, и меня интересует шаблон проектирования для моих конструкторов модели User.
Модель User имеет отношение has_one
к модели AuthMehod, в которой хранятся ее данные аутентификации. У AuthMethod есть модели, которые наследуются от него, например PasswordAuth, FacebookAuth и т. Д.
Когда пользователь регистрируется, мне нужно, чтобы с ним был создан AuthMethod и был связан с ним, поэтому я создал stati c конструкторы в моей модели User:
user.rb
class User < ApplicationRecord
has_one :auth_method, dependent: :destroy
acts_as_paranoid
validates_as_paranoid
validates_uniqueness_of_without_deleted :email
validates_presence_of :first_name, :last_name, :email
def self.create_with_password_auth!(params)
create_with_auth_method!(params, PasswordAuth.new(data: params[:password]))
end
private
# Creates a new User and associates an AuthMethod
# The AuthMethod parameter must be instantiated but not yet saved in the db
def self.create_with_auth_method!(params, auth_method)
user = User.create! user_params(params)
auth_method.user = user
auth_method.save!
user
end
def self.user_params(params)
params.slice(:first_name, :last_name, :email)
end
end
Интересно, конструкторы stati c являются правильным решением для этого. Дело в том, что они удобны, потому что могут обрабатывать специфику c logi c для AuthMethod и связывать его с вновь созданным пользователем, но является ли это хорошей практикой? Я попытался найти способ добиться такого же поведения, например, с обратными вызовами модели, но мне сложно понять, как это сделать.
Спасибо за чтение!