в Access.get / 3 нет совпадений с функциональными предложениями - Почему я получаю эту ошибку? - PullRequest
1 голос
/ 31 октября 2019

Я получаю эту ошибку, когда пытаюсь получить список из базы данных, и я не понимаю, почему.

Это функция, которая выдает ошибку:

  def list_lectures do
    Lecture
    |> Repo.all()
    |> Repo.preload(:author [user: :credential])
  end

И это ошибка, которую я получаю, когда запускаю код:

iex(1)> Ram.CMS.list_lectures
[debug] QUERY OK source="lectures" db=3.4ms decode=0.7ms queue=0.4ms
SELECT l0."id", l0."source", l0."theme", l0."time", l0."title", l0."author_id", l0."inserted_at", l0."updated_at" FROM "lectures" AS l0 [] 
** (FunctionClauseError) no function clause matching in Access.get/3    

    The following arguments were given to Access.get/3:

        # 1
        :author

        # 2
        [user: :credential]

        # 3
        nil

    Attempted function clauses (showing 5 out of 5):

        def get(%module{} = container, key, default)
        def get(map, key, default) when is_map(map)
        def get(list, key, default) when is_list(list) and is_atom(key)
        def get(list, key, _default) when is_list(list)
        def get(nil, _key, default)

    (elixir) lib/access.ex:265: Access.get/3
    (ram) lib/ram/cms.ex:24: Ram.CMS.list_lectures/0
iex(1)> 
  schema "lectures" do
    field :source, :string
    field :theme, :string
    field :time, :string
    field :title, :string
    belongs_to :author, Author

    timestamps()
  end
  schema "credentials" do
    field :email, :string
    field :password, :string
    belongs_to :user, User

    timestamps()
  end
schema "users" do
    field :name, :string
    field :role, :string
    has_one :credential, Credential

    timestamps()
  end

Это ссылка на проект: https://github.com/DavidNeumark/ram

1 Ответ

3 голосов
/ 01 ноября 2019

Access.get / 3 документ гласит:

Получает значение для данного ключа в контейнере (карте, списке ключевых слов или структуре, реализующей поведение Access). ).

Ваш первый аргумент для Access.get / 3:

: автор не является картой, списком ключевых слов или структурой. Это атом.

Полагаю, вы хотите предварительно загрузить вложенную ассоциацию, поэтому она должна выглядеть следующим образом:

  def list_lectures do
    Lecture
    |> Repo.all()
    |> Repo.preload(author: [user: :credential])
  end

Обновление : После проверки вашего github, lib/ram/cms/lecture.ex пропустил псевдоним для Автора. Вышеуказанный код не работает

defmodule Ram.CMS.Lecture do
  use Ecto.Schema
  import Ecto.Changeset

  alias Ram.CMS.Author

  schema "lectures" do
    field :source, :string
    field :theme, :string
    field :time, :string
    field :title, :string
    belongs_to :author, Author

    timestamps()
  end

  @doc false
  def changeset(lecture, attrs) do
    lecture
    |> cast(attrs, [:title, :time, :source, :theme])
    |> validate_required([:title, :time, :source, :theme])
  end
end
...