Sequelize findAllからランダムレコードを選択する 質問する

Sequelize findAllからランダムレコードを選択する 質問する

私は現在これを総当たりで試していますが、問題のコード(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 を忘れずに要求してください。

おすすめ記事