2016-02-05 2 views
0

В настоящее время у меня есть сайт, написанный на Perl, используя Mojolicious и Mojo::Pg. Одна из вещей, которые он делает, - это втягивать и отображать данные с датчиков температуры Ninja Block. У меня есть четыре стола в Postgres, outdoor_temperature, outdoor_humidity, и снова для дома. Таблицы выглядеть следующим образом:Несколько таблиц для одной модели в Sails.js?

Column | Type | Modifiers 
--------+---------+----------- 
time | bigint | not null 
value | numeric | not null 
date | date | not null 

Где time это значение века в миллисекундах (одна запись в минуту), value температура или влажность, и date только что (так каждая запись в определенный день имеет то же значение в столбце date).

Я переписываю сайт, используя Node и Sails.js, в основном только для возможности обучения, и я как бы застрял в лучшем способе делать что-то здесь. В своей инкарнации Perl у меня есть одна подпрограмма для каждой функции, связанной с блокировкой ниндзя (отображающая текущие температуры на сегодняшний день, отображение самого высокого/самого низкого значения за данный день и т. Д.), И я прохожу в том месте, где оно предназначено (внутри или снаружи), и все идет оттуда, как это:

sub current { 
    my ($self, $table) = @_; 
    return $self->pg->db->query("select time, value from $table where time = (select max(time) from $table)")->hash; 
} 

Но с парусами/ватерлинии, это, кажется, что модель состоит только из одной таблицы. Нет никаких связей между любыми таблицами в моей версии Perl, просто некоторые полукоммерные SQL-запросы в каждой отдельной таблице, которые я могу выполнить в Sails, с .query, но я не уверен, как сохранить эту же настройку под парусами, не требуя дублируйте кучу кода при проверке как внутренних, так и наружных таблиц.

Или я думаю об этом совершенно неправильно, и есть намного лучший способ выполнить все это?

ответ

0

Я закончил работу с сервисом, который находится между контроллером и моделью. Функция управления выглядит следующим образом (используя тот же пример, что и выше):

currentTemperature: function(req, res) { 
    ninjaBlockService.getCurrentTemperature(req.param('location'), function(data) { 
     return res.json(data); 
    }); 
} 

И сервисную функцию:

getCurrentTemperature: function(location, callback) { 
    var query = "select time, value from " + location + "_temperature where time = (select max(time) from " + location + "_temperature)"; 

    var locations = { 
     outdoor: function() { 
      NinjaBlockOutdoorTemperature.query(query, function(err, results) { 
       return callback(results.rows); 
      }); 
     }, 
     indoor: function() { 
      NinjaBlockIndoorTemperature.query(query, function(err, results) { 
       return callback(results.rows); 
      }); 
     } 
    }; 

    locations[location](); 
} 

Это, вероятно, может быть немного более элегантной, но это хорошо работает для меня ,

Так как, если вы используете родной PostgreSQL Waterline .query, вам даже не нужны несколько моделей для нескольких таблиц. Я добавил новую модель под названием NinjaBlock, который не имеет атрибутов или ничего, и может запускать мои запросы независимо от того, в какой таблице они в Таким образом, функция выше теперь выглядит следующим образом, вместо:.

getCurrentTemperature: function(location, callback) { 
    var query = "select time, value from " + location + "_temperature where time = (select max(time) from " + location + "_temperature)"; 

    NinjaBlock.query(query, function(err, results) { 
       return callback(results.rows); 
    }); 
} 

просто!

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