【问题标题】:Rails Migration To Add Index To The Difference Between 2 ColumnsRails 迁移为 2 列之间的差异添加索引
【发布时间】:2019-10-22 09:28:10
【问题描述】:

在我的 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

奇怪的是,假设我只想通过 add_index :messages, "(status_updated_at-created_at)", name: 'dashboard_delivery_time_index' 将索引添加到 status_udpated_at - created_at,它会起作用。

有什么建议吗?谢谢!

【问题讨论】:

    标签: ruby-on-rails postgresql indexing database-migration


    【解决方案1】:

    不妨试试

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

    PostgreSQL(9.1) 11.7. Indexes on Expressions.

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

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

    【讨论】:

    • 感谢您的信息!有效。现在说我想在status_updated_at - created_at 中添加一些其他列,它仍然会抛出一个错误,说 PG::UndefinedColumn: ERROR: column "(status_updated_at-created_at)" 不存在。我已经更新了问题。
    【解决方案2】:

    我解决了我的问题,你可以做add_index :messages, "status, account_id, (status_updated_at-created_at)", name: 'dashboard_delivery_time_index'

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 2018-06-28
      • 1970-01-01
      • 2017-02-17
      • 2014-05-13
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多