【发布时间】:2016-04-07 21:05:26
【问题描述】:
在 Ecto 中,我可以轻松做到这一点:
Repo.get!(Kaderi.Forum, params["id"])
通过主键查找记录,默认为id。
但是,我正在考虑使用 slug 而不是 ID 来实现漂亮的 URL。我的模型中有一个 slug 字段,我可以轻松地使用它在 Phoenix 中生成 URL,如下所示:
defmodule Kaderi.Forum do
use Kaderi.Web, :model
@derive {Phoenix.Param, key: :slug}
...
但似乎没有一种简单的方法可以通过slug 字段自动查找记录。
我可以执行以下操作:
Repo.get_by!(Kaderi.Forum, slug: params["id"])
但似乎应该有一些不错的方法在模型中配置它,这样我就可以自动生成 URL,然后通过 slugs 查找记录,而无需触摸控制器。如果我将来更改生成漂亮 URL 的方式,我不应该再次更新控制器。
我是否缺少一些巧妙的 Ecto/Phoenix 技巧来轻松做到这一点?
【问题讨论】:
-
我不确定我是否完全理解您希望实现的“理想”解决方案是什么,但是使用 get _by 有什么问题?与此类似的解决方案是否让您满意? stackoverflow.com/questions/34570612/…
-
@Wobbley 理想的解决方案是使用一行代码来配置模型以通过 slug 而不是 id 来查找记录。我不必更改视图以使用 slug 呈现链接,因此我必须更改控制器才能使用它们似乎有点奇怪。
-
基本上我知道
id的查找不是硬编码的,因为如果您更改模型中的主键,它将使用它。不知道主键部分是不是也是硬编码的,还是可以配置的。 -
@sevenseacat primary_key 部分是基于结构体github.com/elixir-lang/ecto/blob/… 硬编码的,The Programming Phoenix 这本书涵盖了使用自定义 Ecto Type hexdocs.pm/ecto/Ecto.Type.html 作为带有 slug 的主键。它在 slug 中包含 id,例如“13-overriding-primary-key”,与 Ecto.Type 文档中的示例非常相似。
-
我和你在一起@sevenseacat。我希望能够使用 slug/permalink 创建 URL 助手和路径助手!