class NewSupplier include ActiveAttr::Model attr_accessor :current_employee attr_reader :employee, :supplier attribute :supplier_name attribute :email attribute :password attribute :password_confirmation without_current_employee = { unless: 'current_employee.present?' } validates :supplier_name, presence: true validates :email, email: without_current_employee validates :password, presence: without_current_employee, confirmation: without_current_employee validate :employee_uniqueness_or_existence validate :supplier_name_uniqueness def save if valid? persist! true else false end end private def persist! @employee ||= current_employee @employee ||= Employee.new email: email, password: password, password_confirmation: password_confirmation raise "Cannot create employee with #{attributes.inspect}" unless employee.save @supplier = Supplier.create name: supplier_name supplier.add_manager employee end def employee_uniqueness_or_existence return if current_employee.present? return if @employee = current_employee if Employee.count_by_email(email) > 0 employee = Employee.find_by_email(email) if employee.valid_password? password @employee = employee else errors.add :email, :taken end end end def supplier_name_uniqueness return unless (current_employee.present? || @employee.present?) and supplier_name.present? current_suppliers = (current_employee || @employee).suppliers errors.add :supplier_name, 'You already have a supplier with that name' if current_suppliers.map(&:name).include? supplier_name end end