在我的Rails应用程序中,我有一个模型票。它的created_at字段ActiveSupport::TimeWithZone。它还有一个整数类型的number字段。number字段不是主键。主键是一个UUID。
在任何一年,我都不能有两张相同号码的彩票。例如,在2020年,不允许有2个编号为15的工单。但是,如果2个工单是在不同年份创建的,则允许2个工单具有相同的编号。例如,2019年创建的工单编号为15,2020年创建的工单编号为15 -这是可以的。
所以我尝试在tickets表上添加一个索引,这个表是关于numbers和year of created_at的,并要求该索引唯一:
class AddIndexToTickets < ActiveRecord::Migration[5.2]
def change
add_index :tickets, "number,(created_at.year)", unique: true, name: 'index_tickets_uniqueness'
end
end这会导致错误
PG::UndefinedTable: ERROR: missing FROM-clause entry for table "created_at"
LINE 1: ..." ON "tickets" (number,(created_at...这样做的原因是为了避免并发问题。在我的代码中,我有在每次创建新票据时自动递增number的机制。它在大多数情况下都是有效的。但如果创建的两个票证非常接近,这将成为一个问题。
我该怎么办?我认为,根据确切的时间安排,自定义验证也可能失败。
谢谢!
发布于 2020-02-06 04:57:43
在应该使用PostgreSQL语法的时候,您却在尝试使用Ruby语法。调用created_at.date可以在Ruby对象上工作,但是您传递给add_index的参数将由Postgres计算,而不是Ruby。所以它失败了,因为对于Postgres来说,created_at.date在这里是无效的语法。因此,要修复它,您只需切换到PostgreSQL语法。
我认为你可以用这样的东西来实现你想要的:
add_index :tickets, "number, EXTRACT(YEAR FROM created_at)", unique: true, name: 'index_tickets_uniqueness_on_year'.未经测试,但它应该可以工作。More info on the EXTRACT function and other Postgres Date/Time stuff here。
https://stackoverflow.com/questions/60083053
复制相似问题