私は現在これを総当たりで試していますが、問題のコード(postgres を使用)である Sequelize を使用するより良い解決策があると確信しています。
...
then((tile_data) => {
return Encounter.findAll({
where: {
level: tile_data.dataValues.level
},
transaction: transaction_data
}).then((encounter_data) => {
let encounter = encounter_data[Math.floor((Math.random() * encounter_data.length))].dataValues
return Battle.create({
character_id: character_data.dataValues.id,
encounter_id: encounter.id,
encounter_hp: encounter.max_hp,
encounter_mana: encounter.max_mana
}, {
transaction: transaction_data
})
...
見た目が「醜い」だけでなく、このコードでは、配列から 1 つの要素を取り出すためだけに、すべての ENCOUNTERS をメモリにロードしています。
理想的には生のクエリを使用せずに、Sequelize を通じてこれを行う方法を知っている人はいますか?
ありがとう
ベストアンサー1
これを試すことができます:
Encounter.findAll({ order: Sequelize.literal('rand()'), limit: 5 }).then((encounters) => {
// single random encounter
});
Sequelize を忘れずに要求してください。