Функция nil.team_name / 0 не определена - PullRequest
1 голос
/ 08 января 2020

У меня есть два вида запросов. Оба используют один и тот же вид. Возвращается последняя игра JSON. Другой возвращает все игры.

Просмотр

  def render("game.json", %{game: game}) do
    %{id: game.id,
      season_id: game.season_id,
      game_name: game.game_name,
      home_team_id: game.home_team_id,
      home_team_name: game.home_team.team_name,
      away_team_id: game.away_team_id,
      away_team_name: game.away_team.team_name,
      comments: game.comments}
  end

Работает. И возвращает JSON.

  def latest_game do
    query = from g in Game,
            order_by: [desc: g.game_date, desc: g.game_time],
            preload: [:away_team, :home_team]
    query
      |> first(:game_date)
      |> first(:game_time)
      |> Repo.one()
  end

Но это не работает. Он показывает ошибку UndefinedFunctionError at GET /api/games function nil.team_name/0 is undefined.

  def list_games do
    query = from g in Game,
            preload: [:away_team, :home_team]
    Repo.all(query)
  end

Это модель.

defmodule Sample.Scoresheet.Game do
  use Ecto.Schema
  import Ecto.Changeset

  schema "games" do
    field :game_name, :string
    field :game_date, :date
    field :game_time, :time

    belongs_to :home_team, Sample.Scoresheet.Team
    belongs_to :away_team, Sample.Scoresheet.Team

    timestamps()
  end

Пожалуйста, дайте мне несколько советов. Спасибо.

1 Ответ

3 голосов
/ 08 января 2020

Ошибка

UndefinedFunctionError при GET /api/games функция nil.team_name/0 не определена

означает, что одна (или обе) из ассоциаций

belongs_to :home_team, Sample.Scoresheet.Team
belongs_to :away_team, Sample.Scoresheet.Team

не задано, и game.home_team.team_name или game.away_team.team_name не удается добраться до team_name, поскольку он возвращает nil в качестве команды.

Необходимо иметь ограничения для базы данных (таблица games) сделать оба внешних ключа для teams обязательными, таким образом вы получите значимые сообщения об ошибках и , данные будут всегда согласованными.

Тем временем, я бы посоветовал вам чтобы проверить ваши семена и / или как вы добавляете games в базу данных и сделаете оба teams обязательными с Ecto.Changeset.validate_required/3.

...