函数 nil.team_name/0 未定义

function nil.team_name/0 is undefined

我有两种查询。两者都使用相同的视图。 一款 returns 最新游戏 JSON。 其他returns所有游戏

查看

  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

有效。并且 returns 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

请多多指教。 谢谢。

错误

UndefinedFunctionError at GET /api/games function nil.team_name/0 is undefined

表示关联中的一个(或两个)

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

未设置,game.home_team.team_namegame.away_team.team_name 无法到达 team_name 因为它 returns nil 作为一个团队。

应该对数据库进行约束 (table games),使 teams 的两个外键都是强制性的,这样你就会得到有意义的错误消息 并且数据将始终保持一致。

与此同时,我建议你检查你的种子 and/or 你是如何将 games 插入数据库的,并使 teams 成为 Ecto.Changeset.validate_required/3 的强制项。