首页 > 解决方案 > Rails 迁移为 2 列之间的差异添加索引

问题描述

在我的 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_atcreated_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',它会起作用。

有什么建议么?谢谢!

标签: ruby-on-railspostgresqlindexingdatabase-migration

解决方案


也许试试

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

PostgreSQL(9.1) 11.7。表达式的索引

CREATE INDEX 命令的语法通常需要在索引表达式周围加上括号...当表达式只是一个函数调用时,括号可以省略...

由于您想使用表达式而不是函数,因此应该根据文档使用额外的括号。


推荐阅读