Nano Hash - криптовалюты, майнинг, программирование

Как добавить в модель дополнительное свойство?

У меня есть Model, который соответствует Content:

import Vapor
import Fluent

final class User: Model, Content {
    static let schema = "user"
    
    @ID(key: .id)
    var id: UUID?

    @Field(key: "email")
    var email: String

    init() { }

    init(id: UUID? = nil, email: String) {
        self.id = id
        self.email = email
    }
}

Это можно получить из базы данных и напрямую вернуть из маршрута, поэтому клиент получает пользователей в виде JSON.

Теперь я хочу добавить пользователю дополнительное свойство, которое не хранится в базе данных, а имеет фиксированное значение или просто добавляется после загрузки пользователя из базы данных:

final class User: Model, Content {
    // ...
    var someOther: String = "hello"
    // ...
}

or

final class User: Model, Content {
    // ...
    var someOther: String? // set later
    // ...
}

Теперь проблема в том, что это свойство никогда не добавляется в JSON, поэтому клиент получает только пользовательские id и email и НЕ someProperty. Как я могу это исправить?

11.09.2020

  • Если возникает вопрос, как исключить свойства из Swift 4 Codable? тогда ответ здесь stackoverflow.com/questions/44655562/ 11.09.2020
  • Моя проблема в том, что someProperty НЕ включен в результат 11.09.2020
  • Можем ли мы взглянуть на фрагмент кода, где происходит кодирование? 11.09.2020
  • может быть, Fluent по дизайну кодирует только свойства @Field? 11.09.2020
  • @imike Это Fluent, который выполняет кодировку? OP, может быть, у вас должна быть новая структура, которая также содержит это новое поле, а затем вы сопоставляете эту новую структуру при отправке? 11.09.2020
  • @JoakimDanielson да, но это похоже на взлом, я хочу знать, есть ли правильное решение 11.09.2020
  • На самом деле я не вижу в этом хака, у вас есть один пользовательский тип, который соответствует тому, что сохраняется, и здесь вам нужно использовать данные немного по-другому, поэтому вы создаете новый пользовательский тип для этого сценария. И вы можете сделать эту структуру неизменной, чтобы сделать решение еще чище. 11.09.2020

Ответы:


1

Если вы хотите отправить или получить данные от вашего клиента, которые имеют представление, отличное от того, что есть в вашей модели, обычной практикой является определение пользовательского типа, который затем можно преобразовать в тип модели и из него.

Учитывая это, вы должны определить новый тип User.Response, который соответствует Content вместо модели User, и вместо этого вернуть его из вашего маршрута.

extension User {
    struct Response: Content {
        let id: UUID
        let email: String
        let otherValue = "Hello World"
    }
}


func user(request: Request) throws -> EventLoopFuture<User.Response> {
    return User.find(UUID(), on: request.db).flatMapThrowing { user in
        guard let id = user.id else {
           throw Abort(.internalServerError, "User is missing ID")
        }

        return User.Response(id: id, email: user.email) 
    }
}

Причина, по которой дополнительное значение, которое вы добавили, не было закодировано из вашей модели, заключается в том, что кодировщик по умолчанию для типов моделей перебирает свойства поля и кодирует эти свойства, поэтому, если у вас есть свойство, которое не использует один из ID, Field , Parent, Children или другие обертки свойств поля, оно не будет закодировано.

11.09.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..