0

現在、 MojoliciousMojo::Pgを使用して、Perl で書かれた Web サイトを持っています。その機能の 1 つは、Ninja Block の温度センサーからデータを取得して表示することです。Postgres には 4 つのテーブルがありoutdoor_temperatureoutdoor_humidity屋内でも同じです。テーブルは次のようになります。

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

はミリtime秒単位のエポック値 (1 分あたり 1 レコード)、valueは温度または湿度であり、それdateはまさにそれです (したがって、特定の日のすべてのレコードは列に同じ値を持ちdateます)。

Node と Sails.js を使用してサイトを書き直していますが、これは主に学習の機会のためであり、ここで行う最善の方法に固執しています。その Perl 化身では、Ninja Block 関連の機能 (今日の現在の気温を表示する、特定の日の最高/最低を表示するなど) ごとに 1 つのサブルーチンがあり、それが対象の場所 (屋内または屋外) を渡します。 )そして、すべてが次のようにそこから始まります:

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 では、モデルが 1 つのテーブルだけで構成されているようです。私の Perl バージョンではどのテーブル間にも結合はなく、Sails で実行できる個々のテーブルごとにいくつかのやや複雑な SQL クエリがあるだけですが、Sails で.query複製せずにこの同じセットアップを保持する方法がわかりません屋内と屋外の両方のテーブルをチェックするときのコードの束。

それとも、これについて完全に間違って考えており、すべてを達成するためのはるかに優れた方法がありますか?

4

1 に答える 1

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

単純!

于 2016-02-06T09:53:21.320 に答える