2017-09-18 5 views
0

ユーザーモデルで「合計列」を作成しようとしています。私はどのように計算をすることができるか分からない。以前はフロントエンドでやっていましたが、非常に限られた並べ替えオプションが残っていましたので、バックエンドでこれを行い、代わりに合計行を追加したいと思います。他の列の計算からmysqlでジョイント列を作成する方法

これは私のモデルは次のようになります。= {

autosubscribe: ['destroy'], 

attributes: { 
    name: { 
     type: 'string', 
     required: true 
    }, 
    email: { 
     type: 'email', 
     unique: true, 
     required: true 
    }, 
    password: { 
     type: 'string', 
     required: true, 
     minLength: 6 
    }, 
    status: { 
     type: 'string', 
     defaultsTo: 'offline', 
     required: false 
    }, 
    score: { 
     type: 'integer', 
     defaultsTo: 0, 
     required: false 
    }, 
    totalwins: { 
     type: 'integer', 
     defaultsTo: 0, 
     required: false 
    }, 
    totalgames: { 
     type: 'integer', 
     defaultsTo: 0, 
     required: false 
    }, 
    ip: { 
     type: 'string', 
     required: false 
    } 
} 
}; 

module.exportsは私が

scorepct: { 
type: 'integer', 
defaultsTo: totalwins/totalgames, 
required: false 
} 

のようなものを追加してみました。しかし、これは動作するようには思えない、任意のアイデアがありますどのように私は私のユーザーモデルからこれを行うことができますか?

答えて

1

に動作します、ドキュメントを見てみます。 - あなたはせずに、それを必要な場所理由だけで割合を計算しませ

attributes: { 
    // ... 
    scorepct: { 
     type: 'integer' 
     defaultsTo: 0 // always 0 at creation time 
    }, 
}, 

afterUpdate: function(attrs, next) { 
    var calculatedPct = attrs.totalgames === 0 ? 0 : attrs.totalwins/attrs.totalgames; 
    if (calculatedPct === attrs.scorepct) { 
     return next(); 
    } 
    User.update(attrs.id, {scorepct: calculatedPct}).exec(function(err, user) { 
     // handle the error 
     return next(); 
    }); 
}, 

は、これは多くの問題のように思える:あなたは、あなたが望むようにあなたがデフォルトcreateまたはupdateメソッドを使用するたびに、そのプロパティが更新されたことを確認することができますDBに結果を格納する? .findでこれを自動的に行うか、APIなどでデータを呼び出すときにこれを行うことができます。

+0

答えをいただきありがとうございます。私はフロントエンドでそれを計算していましたが、私はスコアを追加しましたが、それはお尻の痛みのような並べ替えをしました。それはそれのための理想的な方法かもしれないように聞こえる、助けをありがとう! –

+0

ええ、私は見る - あなたは膨大な量のユーザーを取得した場合、すべてのレコードを取得するのではなく、最高のパーセンテージを持つレコードだけを取得したいと考えています。その場合、この 'afterUpdate'が本当に必要なものかもしれません。 – arbuthnott

+0

幸運にも、私は32を引き出すだけで、勝利に基づいてソートすることができます –

0

私はあなたが欲しいものを行うための唯一の方法は、あなたのモデルにlifecycle callbacksを追加することだと思う多分これが

scorepct: { 
    type: 'integer' 
    defaultsTo: function(){ return this.totalwins/this.totalgames } 
    required: false 
} 

または

scorepct: function(){ return this.totalwins/this.totalgames } 
+0

これを追加すると、[Error(E_UNKNOWN)]に予期しないエラーが発生しました。 :ER_BAD_FIELD_ERROR:「フィールドリスト」のに「user.scorepct」という列がありますが、アプリにログインしようとしました。しかし、もし私のテーブルにもその列を追加すると、結果は 'null'になります。 :/ –

+0

ofc、 'return'><を忘れてしまい、コメントを編集しました。 うまくいけば、それは仕事をするだろう –

+0

うーん、私のためにまだ戻ってくる 'null'。私はこれが正しい軌道にあると思う。 –

関連する問題