首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails在created_at年份添加索引

Rails在created_at年份添加索引
EN

Stack Overflow用户
提问于 2020-02-06 03:44:49
回答 1查看 159关注 0票数 1

在我的Rails应用程序中,我有一个模型票。它的created_at字段ActiveSupport::TimeWithZone。它还有一个整数类型的number字段。number字段不是主键。主键是一个UUID。

在任何一年,我都不能有两张相同号码的彩票。例如,在2020年,不允许有2个编号为15的工单。但是,如果2个工单是在不同年份创建的,则允许2个工单具有相同的编号。例如,2019年创建的工单编号为15,2020年创建的工单编号为15 -这是可以的。

所以我尝试在tickets表上添加一个索引,这个表是关于numbers和year of created_at的,并要求该索引唯一:

代码语言:javascript
复制
class AddIndexToTickets < ActiveRecord::Migration[5.2]
  def change
    add_index :tickets, "number,(created_at.year)", unique: true, name: 'index_tickets_uniqueness'
  end
end

这会导致错误

代码语言:javascript
复制
PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "created_at"
LINE 1: ..." ON "tickets"  (number,(created_at...

这样做的原因是为了避免并发问题。在我的代码中,我有在每次创建新票据时自动递增number的机制。它在大多数情况下都是有效的。但如果创建的两个票证非常接近,这将成为一个问题。

我该怎么办?我认为,根据确切的时间安排,自定义验证也可能失败。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-06 04:57:43

在应该使用PostgreSQL语法的时候,您却在尝试使用Ruby语法。调用created_at.date可以在Ruby对象上工作,但是您传递给add_index的参数将由Postgres计算,而不是Ruby。所以它失败了,因为对于Postgres来说,created_at.date在这里是无效的语法。因此,要修复它,您只需切换到PostgreSQL语法。

我认为你可以用这样的东西来实现你想要的:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60083053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档