Rails Migration เพื่อเพิ่มดัชนีไปยังความแตกต่างระหว่าง 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_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' มันจะได้ผล

มีข้อเสนอแนะอะไรบ้าง? ขอบคุณ!


person jl118    schedule 06.06.2019    source แหล่งที่มา


คำตอบ (2)


อาจจะลอง

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

PostgreSQL(9.1) 11.7. ดัชนีนิพจน์

โดยปกติไวยากรณ์ของคำสั่ง CREATE INDEX จะต้องเขียนวงเล็บรอบนิพจน์ดัชนี... สามารถละเว้นวงเล็บได้เมื่อนิพจน์เป็นเพียงการเรียกใช้ฟังก์ชัน...

เนื่องจากคุณต้องการใช้นิพจน์มากกว่าฟังก์ชัน วงเล็บเพิ่มเติมจึงควรทำตามเอกสาร

person engineersmnky    schedule 06.06.2019
comment
ขอบคุณสำหรับข้อมูล! มันได้ผล ตอนนี้พูดว่าฉันต้องการเพิ่มคอลัมน์อื่นพร้อมกับ status_updated_at - created_at มันจะยังคงแสดงข้อผิดพลาดว่า PG::UndefColumn: ERROR: column (status_updated_at-created_at) ไม่มีอยู่ ฉันได้อัปเดตคำถามแล้ว - person jl118; 07.06.2019

ฉันแก้ไขปัญหาของฉันแล้ว คุณทำได้ add_index :messages, "status, account_id, (status_updated_at-created_at)", name: 'dashboard_delivery_time_index'

person jl118    schedule 06.06.2019