Как запустить функцию RANK () в модели

#sql-server #sequelize.js

#sql-сервер #sequelize.js

Вопрос:

Как я могу запустить функцию rank для генерации атрибута в данной модели sequelize?

Например, учитывая модель:

 Players.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false
    },
    rating: type: DataTypes.FLOAT
  },
  { sequelize }
)
  

Я хотел бы получать атрибут rank при запуске Players.getAll({ rank: rating }) . Это сгенерировало бы SQL, подобный:

 SELECT id, rating, RANK() OVER (ORDER BY rating DESC) as rank FROM players
  

Как бы я это сделал, используя sequelize?

Ответ №1:

Вы можете использовать функцию Sequelize Literal следующим образом —

 attributes: [
          'id', 'rating',
          [Sequelize.literal('(RANK() OVER (ORDER BY rating DESC))'), 'rank']
    ]
  

для создания новых атрибутов.

Комментарии:

1. Спасибо! Это сработало, но у меня возникла другая проблема: этот rank атрибут доступен только в возвращаемом запросе, если я JSON.stringify() его. Это проблема, потому что при построении возвращаемой модели пропускаются свойства с помощью геттеров, которые у меня также есть. Я нашел обходной путь, при котором я объединяю строковую модель с исходной моделью, но это кажется халтурным. Есть идеи, как получить доступ к этим атрибутам непосредственно в модели без упорядочивания?

2. Я выяснил, что Model.get() это вернет атрибуты, добавленные таким образом, но это вернет виртуальные средства получения, только если они определены как атрибуты в Model.init() , а не в определении класса модели.

3. Это именно то, что я искал, 1 для вас .