Ecto+Phoenix:如何使用与 :id 不同的键创建资源路径?

Ecto+Phoenix: How to make resource paths with a different key than :id?

我有一个应用程序,其中资源通过普通 ID 保存在数据库中。但是,为了防止数据库枚举,在路径和链接中向用户显示的 ID 类似于 UUID。 (例子:http://example.com/payment/yta6Bo34s

要在 Phoenix+Ecto 中创建普通的、基于 id 的链接,可以这样做:

link to: payment_path(@conn, :show, payment)

但是,这隐含地使用了此处传递的 %Payment{} 结构的 .id 字段。

使用UUID时,必须做

link to: payment_path(@conn, :show, payment.uuid)

或者,在我的应用程序中,UUID 在数据库中保存为 bigin,但显示为 base36 字符串:

link to: payment_path(@conn, :show, UUID.encode(payment.uuid))

有没有办法简化这个过程?例如,是否存在可以为传递给 Phoenix 路径助手的结构实现的协议,以便它们自动使用自定义过程生成 show/edit/update/delete 路径?

我认为您可以按照 or the derive form as described here 所述实施 to_param