Вызов пользовательского макроса в блоке схемы Ecto - PullRequest
0 голосов
/ 06 октября 2018

Определение модуля схемы для платформы Ecto:

defmodule Storage.Repo.Category do
  use Ecto.Schema

  schema "categories" do
    field :name
    field :path
    field :color
    field :desc
    field :sequ, :integer

    hello()
    timestamps()
  end

  defmacro hello do
    quote do
      field :hello
    end
  end
end

Ошибка компиляции

 (CompileError) lib/storage/repo/category.ex:15: undefined function hello/0

Что мне делать?В чем причина этого?

1 Ответ

0 голосов
/ 07 октября 2018

Вам нужно определить свой макрос в другом модуле, require/import, а затем вызвать его:

defmodule Storage.SchemaMacros do
  defmacro hello do
    quote do
      field :hello
    end
  end
end

Теперь назовите его:

defmodule Storage.Repo.Category do
  use Ecto.Schema
  import Storage.SchemaMacros

  schema "categories" do
    field :name
    field :path
    field :color
    field :desc
    field :sequ, :integer

    hello()
    timestamps()
  end
end

Обычно вы можете определять и вызывать макросы в одном и том же модуле (при условии, что он определен до его вызова), но способ работы собственного макроса schema/2 в Ecto не позволяет вам сделать это.

...