TypeFramework Relationships

Я играл с TypeScript MVC Framework TypeFramework и пытаюсь выяснить, как создавать отношения между моделями. Я знаю, что он использует ватерлинию ORM. Пример модели Waterline с отношением:

// A user may have many pet
var User = Waterline.Collection.extend({
  attributes: {
    firstName: 'string',
    lastName: 'string',

    // Add a reference to Pets
    pets: {
      collection: 'pet',
      via: 'owner'
    }
  }
});

// A pet may only belong to a single user
var Pet = Waterline.Collection.extend({
  attributes: {
    breed: 'string',
    type: 'string',
    name: 'string',

    // Add a reference to User
    owner: {
      model: 'user'
    }
  }
});

Пример модели TypeFramework выглядит так:

class User extends TF.Model{
    firstName: string,
    lastName: string
}

Код для TF.Model:

class Model {
    public id: number;
    public createdAt: Date;
    public updatedAt: Date;
    static collectionName: string;
    static schema: boolean;
    static adapter: string;
    static attributes: any;
    private static collection;
    public save: <T>(callback: ISingleResultCallback<T>) => void;
    public destroy: <T>(callback: INoResultCallback<T>) => void;
    static save<T>(model: T, callback: ISingleResultCallback<T>): void;
    static destroy<T>(model: T, callback: INoResultCallback<T>): void;
    static all<T>(): DbQueryEnd<T>;
    static where(query: {}): WL.IQuery;
    static get(id: number): DbQueryUnique<any>;
    static first<T>(query: {}): DbQueryUnique<T>;
    static find<T>(): DbQuery<T>;
    static query<T>(query: string): DbQueryRaw<T>;
    static validate(attr: string, options: ModelValidation): any;
    static validate(attrs: string[], definition: ModelValidation): any;
    private static extend(from, to);
}

Я не уверен, как интегрировать отношения в строго типизированную модель TypeFramework. Любые предложения или помощь будет принята с благодарностью.

1 ответ

Решение

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

Во-первых, если вы согласны с тем, чтобы ваши модели были в Typescript, а код ватерлинии был в Javascript, это значительно облегчит эту задачу.

Однако, если вы хотите использовать Waterline в Typescript, вам, вероятно, потребуется создать файлы.d.ts. В настоящее время, к сожалению, я не вижу ничего доступного для DefinitiveTyped. Это не особенно просто, но с некоторой силой воли вы, вероятно, сможете получить концепцию, достаточную для того, чтобы она заработала. Официальное руководство довольно хорошее.

Тем не менее, на код!

Вам нужно будет создать экземпляр вашего класса со всем необходимым. Если вы не добавите контент в свойства своего класса, у вас есть хорошие шансы пропустить их. Вам нужно вызвать конструктор вашего базового объекта с помощью super(); также.

class User extends Model
{
    firstName: string;
    lastName: string;
    pets: IPet[];

    constructor(firstname: string, lastname: string, pets: IPet[])
    {
        super();
        this.firstName = firstname;
        this.lastName = lastname;
        this.pets = pets;
    }
}

interface IPet
{
    breed: string;
    petType: string;
    name: string;
}

Возможно, вы захотите сделать питомца и фактический класс, но на данный момент мы предположим, что это не так.

Итак, все, что вам нужно сделать, чтобы создать пользователя Waterline, как вы описали выше, будет выглядеть так:

var User = Waterline.Collection.extend(
    new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
);

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

static GetJimAndPets() : User
{
    return new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
}

static GetUserById(id: number) : User
{
    //Logic here
    return null;
}

Тогда вы могли бы назвать свой метод еще проще:

var User = Waterline.Collection.extend(User.GetJimAndPets());

Это должно сработать, но, как я уже говорил, я не знаю, как это проверить и YMMV.

Другие вопросы по тегам