2014-10-19 2 views
4

В отличие от a previous question Я спросил здесь, это связано и так хотелось связать его.Как получить название модели или класс модели записи ватерлинии?

Я изо всех сил, чтобы выяснить, как я могу получить имя модели (идентификация) или модель «класса» (выставлены в sails.models) из записи. Итак, учитывая запись waterline, как я могу узнать ее название модели или класс?

Пример (конечно здесь я знаю модель User, но это пример):

User.findOne(1).exec(function(err, record) { 
    // at this point think that we don't know it's a `user` record 
    // we just know it's some record of any kind 
    // and I want to make some helper so that: 
    getTheModelSomehow(record); 
    // which would return either a string 'user' or the `User` pseudo-class object 
}); 

Я попытался получить к нему доступ с record.constructor, но это не User, и я не мог найти свойство на record, выставляя объект псевдокласса модели или имя модели записи.

UPDATE: Чтобы уточнить, я хочу функцию, к которой я буду давать какую-либо запись, и который будет возвращать модель этой записи либо как название модели или объект модели псевдо-класс, как в sails.models пространства имен.

modelForRecord(record) // => 'user' (or whatever string being the name of the record's model) 

или

modelForRecord(record) // => User (or whatever record's model) 
+0

вы храните что-нибудь в вашей модели пользователя? Почему вы думаете, что это не «запись пользователя»? – monkeyinsight

+0

это пример, я просто хочу функцию, которая принимает запись в параметре, и возвращает мне модель этой записи – Huafu

ответ

7

WOW, хорошо после нескольких часов исследований, вот как я делаю это для тех, кто заинтересован (это очень сложно взломать, но пока не удалось найти другого способ сделать):

Допустит record, что вы получите от findOne, create ... в обратном вызове, чтобы узнать, что экземпляр это, и поэтому найти название модели владеющей запись, вы вынуждены пересекать Л.Л. ваши модели (sails.models.*) и сделать instanceof вызов таким способом:

function modelFor(record) { 
    var model; 
    for (var key in sails.models) { 
    model = sails.models[key]; 
    if (record instanceof model._model.__bindData__[0]) { 
     break; 
    } 
    model = undefined; 
    } 
    return model; 
} 

Не пытайтесь просто сделать instanceof model, что не работает

После, если вам нужно название модели просто modelFor(record).globalId, чтобы получить Это.

+0

Я не знаю, кто оценит «-1» на мой ответ, но пока это единственный ответ вопрос во всех деталях, даже если не хаки (не говоря, что другие ответы бесполезны, конечно) – Huafu

+0

В общем, проверка типа объекта не является хорошей практикой программирования, если вам нужна проверка типов, вы, возможно, слишком сложны в своей логике. Да, в некоторых случаях требуется проверка типов, но если вы часто это делаете, возможно, вы хотите обновить свой способ делать что-то. – cybercow

+0

Конечно, но что делать, если вы хотите выполнить некоторую общую обработку в зависимости от каких-либо статических свойств или методов вашей модели, какая ватерлиния не обеспечит доступ к экземпляру? – Huafu

1

В определении модели, почему бы не просто создать атрибут модели. Затем модель будет возвращена при каждом вызове записи. Это будет работать даже после того, как запись станет объектом JSON.

module.exports = { 
attributes : { 
     model : {type:'string',default:'User'} 
} 
} 
+0

Нет, это означало бы, что я должен добавить свойство/column ко всем моим таблицам/коллекциям в моей базе данных, которые были бы сумасшедшими. Также я не хочу идти к решению, где мне нужно добавить свойство/атрибут/помощник для каждой модели, я хочу, чтобы общее решение, где можно было бы установить его определение модели, и мой помощник будет работать. – Huafu

+0

Отлично. Это однострочное изменение вашей модели и имеет некоторые преимущества. Я ценю, что это не решение для вас, но оно по-прежнему является решением и на самом деле не заслуживает ниспроверки. На самом деле решение Четана, вероятно, лучше всего. – Meeker

+0

вы добавляете столбец во все ваши таблицы db, чтобы знать имя таблицы ... отлично? – Huafu

0

Паруса раскрывает все в объекте запроса. Попробуйте присвоить название модели таким образом:

var model = req.options.model || req.options.controller; 

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

var Model = req._sails.models[model]; 

Проверьте исходный код, чтобы увидеть его в действии.(https://github.com/balderdashy/sails/blob/master/lib/hooks/blueprints/actionUtil.js#L259)

+0

Да, но я не хочу использовать объект запроса, что, если я иду от «пользовательского» маршрута, и я хочу, например, знать «модель» записи «post»? Или что, если я просто запускаю какую-либо работу на сервере с помощью ватерлинии lib, не находясь внутри паруса? – Huafu

+0

В своем собственном ответе вы ссылаетесь на паруса. Как бы ваш ответ решался для сервера, используя только ватерлинию? Почему вы не хотите использовать объект запроса? В вашем вопросе связаны «post» и «user»? –

+0

Ну, я не считал свой ответ действительным, потому что мне нужен менее хакерский способ. В моем ответе я использую 'sails' только потому, что список определенных моделей находится в' sails.models'.Если вы используете только ватерлинию, вам нужно сохранить определенные модели в каком-либо месте вместо 'sails.models'. Я не хочу использовать объект запроса, потому что я хочу иметь возможность определять модель ЛЮБОЙ записи от ЛЮБОГО запроса или, как я сказал, вне парусов. Отношение к 'post' и' user' не имеет значения, они просто приведены в качестве примеров ;-) Спасибо @Chetan Shenoy в любом случае. – Huafu

0

Используйте этот пример для разбора название модели

var parseModel = function(request) { 
    request = request.toLowerCase(); 
    return sails.models[request]; 
}; 

и использовать в контроллере этот код для использования этой модели

parseModel(req.param('modelname')).find().then().catch(); 
+0

Спасибо, но, как я прокомментировал ответ от Chetan Shenoy, это не работает, если вы хотите узнать модель записи, которая не относится к запросу. – Huafu

Смежные вопросы