2016-02-05 37 views
0

我目前有一個用Perl編寫的網站,使用MojoliciousMojo::Pg。它所做的一件事就是引入並顯示來自忍者座的溫度傳感器的數據。我在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; 
} 

但是對於Sails/Waterline,它似乎是一個模型只包含一個表。在我的Perl版本的任何表格之間沒有任何連接,只是在每個單獨的表格上的一些半複雜的SQL查詢,我可以用.query在Sails中完成,但我不知道如何在Sails中保留相同的設置,而無需在檢查室內和室外表格時複製一堆代碼。

還是我在想這個完全錯誤,還有一個更好的方法來完成這一切?

回答

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](); 
} 

這很可能是更優雅一點,但它的工作很好地爲我。

因此,事實證明如果您使用的是Waterline的PostgreSQL本機.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); 
    }); 
} 

簡單!