【问题标题】:How to customize id of Phoenix如何自定义 Phoenix 的 id
【发布时间】:2016-05-28 14:05:22
【问题描述】:

使用phoenix框架,:id, :integer会自动生成。 http://www.phoenixframework.org/docs/ecto-custom-primary-keys

但我不希望它自动生成并使用自定义 id 字段,例如:id, :string,就像这样 http://ruby-journal.com/how-to-override-default-primary-key-id-in-rails/

设置

defmodule MyApp.Item do
  use MyApp.Web, :model

  # @primary_key {:id, :id, autogenerate: false}
  schema "items" do
    field :id, :string, autogenerate: false # some unique id string
    field :type, :integer

它引发** (ArgumentError) field/association :id is already set on schema https://github.com/elixir-lang/ecto/blob/db1f9ccdcc01f5abffcab0b5e0732eeecd93aa19/lib/ecto/schema.ex#L1327

【问题讨论】:

标签: elixir phoenix-framework


【解决方案1】:

我遇到了两个问题。

  1. @primary_key {:id, :id, autogenerate: false}fields :id 子句都不能在架构定义中。

这就是解决办法

defmodule MyApp.Item do
  use MyApp.Web, :model

  @primary_key {:id, :string, []}
  schema "items" do
    # field :id, :string <- no need!
  1. 为了避免自动生成 id,我只需要编辑迁移文件

这样

defmodule MyApp.Repo.Migrations.CreateItem do
  use Ecto.Migration

  def change do
    create table(:items, primary_key: false) do
      add :id, :string, primary_key: true

最后,我可以执行mix ecto.migrate,可以得到下面的表定义

mysql> SHOW CREATE TABLE items;
| items | CREATE TABLE `builds` (
  `id` varchar(255) NOT NULL,

官方文件肯定提到了这一点 http://www.phoenixframework.org/docs/ecto-custom-primary-keys

我们先来看看迁移,priv/repo/migrations/20150908003815_create_player.exs。我们需要做两件事。第一个是将第二个参数 - primary_key: false 传递给 table/2 函数,这样它就不会创建 primary_key。然后我们需要将 primary_key: true 传递给 name 字段的 add/3 函数,以表明它将是 primary_key。

但一开始,您不需要列id,您只需在迁移中执行create table(:items, primary_key: false),然后编辑架构

defmodule MyApp.Item do
  use MyApp.Web, :model

  # @primary_key {:id, :string, []}
  @primary_key false # to avoid unnecessary IO scanning
  schema "items" do
    # field :id, :string <- no need!

虽然自己解决了,还是谢谢

【讨论】:

  • 如果在迁移时设置自定义主ID,为什么不在架构中设置?它是否会使 id 无法用于进一步查询,比如苦艾酒(graphql)? @otiai10
  • 请问您如何设置id 值?在控制器中还是在模型定义中?
  • @StevenV 这是一个特定于项目的解决方案,而且只是我项目的开始,所以我只是使用迁移来改变(我记得)。我猜,在模式中定义它可能会起作用。
  • @W.M.我使用了来自外部服务的一些字符串(例如来自其他服务的 MongoDB ObjectID),因此它在控制器中(我记得。抱歉,很久以前我在 Phoenix 上工作)
  • @otiai10,我已经设法使用put_change 在模型类中设置它。凤凰很有前途,表现不错。您是否找到了其他更快/更好的框架?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2019-10-29
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多