Rails Migration для добавления индекса к разнице между 2 столбцами - PullRequest
0 голосов
/ 06 июня 2019

В моем приложении Ruby on Rails есть модель Message, в которой есть столбец created_at и столбец status_updated_at.Оба они являются датами.

Чтобы ускорить такие запросы, как Message.where(status: 'delivered', account_id: 11).where('status_updated_at - created_at >= ?', "180 seconds"), я хочу добавить индекс к разнице между столбцами status_updated_at и created_at.

Я пробовал этот код:

class AddMessageIndicesForDashboard < ActiveRecord::Migration[5.1]
  def change
    add_index :messages, [:status, :account_id, :created_at, "(status_updated_at-created_at)"], name: 'dashboard_delivery_time_index'
  end
end

, что приводит к PG::UndefinedColumn: ERROR: column "status_updated_at-created_at" does not exist

Странно, скажите, если бы я только хотел добавить индекс к status_udpated_at - created_at, выполнив add_index :messages, "(status_updated_at-created_at)", name: 'dashboard_delivery_time_index', он будет работать.

Есть предложения?Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Может быть попробовать

add_index :messages, "(status_updated_at-created_at)", name: 'dashboard_delivery_time_index'  

PostgreSQL (9.1) 11.7. Индексы по выражениям .

Синтаксис команды CREATE INDEX обычно требует записи круглых скобок вокруг выражений индекса ... Круглые скобки могут быть опущены, если выражение является просто вызовом функции ...

Поскольку вы хотите использовать выражение, а не функцию, дополнительные скобки должны делать это в соответствии с документами.

0 голосов
/ 07 июня 2019

Я исправил свою проблему, вы можете сделать add_index :messages, "status, account_id, (status_updated_at-created_at)", name: 'dashboard_delivery_time_index'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...