在同一个 eex 模板中显示来自两个模式的相关数据

Show related data from two schemas in the same eex template

我想在表格中显示一些相关数据。我有一个学生模式

schema "students" do
  field :firstname, :string
  field :lastname, :string
  field :birthday, Ecto.Date
  field :joined_on, Ecto.Date
  field :gender, :string
  timestamps()
end

每个学生都可以有一个母亲和一个父亲,我将他们指定为Parents并创建了一个单独的架构和单独的table。每个 parent 记录最多可以与 1 个学生链接(奇数,但适用于我的用例)。

schema "parents" do
  field :relationship, :string
  field :fullname, :string
  field :qualification, :string
  belongs_to :student, Myapp.Student, foreign_key :student_id
  timestamps()
end

我正在尝试创建一个可以同时创建新学生和 Parents 的表单。因此,将有相同形式的 Student 字段和 Mother 和 Father 字段。我尝试了多种方法在 eex 模板中获取此 Parents 数据,但我失败了。

这是我在 Student 控制器的 new 方法中使用的内容:

def new (conn, _params) do
  changeset = Student.changeset(%Student{})
  render(conn, "new.html", [changeset: changeset])
end

我认为这里有问题,因为当我使用 Html 助手时,我无法获得 eex 表单中的 parents 字段。我希望能够同时创建 parent 个新学生。如果我可以使用相同的 eex 模板编辑它们,那就太好了。谢谢。

您需要在 Student 模型中使用 has_manycast_assoc

defmodule Myapp.Student do
  use Myapp.Web, :model

  schema "students" do
    field :firstname, :string
    field :lastname, :string
    field :birthday, Ecto.Date
    field :joined_on, Ecto.Date
    field :gender, :string
    has_many :parents, Myapp.Parent

    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \ %{}) do
    struct
    |> cast(params, [:firstname, :lastname, :birthday, :joined_on, :gender])
    |> cast_assoc(:parents)
    |> validate_required([:firstname, :lastname, :birthday, :joined_on, :gender])
  end
end

web/templates/student/form.html.eex 中使用 inputs_for:

<%= inputs_for f, :parents, fn pf -> %>
  <h3>Parent form</h3>

  <div class="form-group">
    <%= label pf, :relationship, class: "control-label" %>
    <%= text_input pf, :relationship, class: "form-control" %>
    <%= error_tag pf, :relationship %>
  </div>

  <div class="form-group">
    <%= label pf, :fullname, class: "control-label" %>
    <%= text_input pf, :fullname, class: "form-control" %>
    <%= error_tag pf, :fullname %>
  </div>

  <div class="form-group">
    <%= label pf, :qualification, class: "control-label" %>
    <%= text_input pf, :qualification, class: "form-control" %>
    <%= error_tag pf, :qualification %>
  </div>
<% end %>

您可以在学生控制器操作中建立两个家长 new:

alias Myapp.Parent

def new(conn, _params) do
  changeset = Student.changeset(%Student{parents: [%Parent{}, %Parent{}]})
  render(conn, "new.html", changeset: changeset)
end

还需要在 StudentController 中为 editupdate 操作预加载 :parents

student = Repo.get!(Student, id) |> Repo.preload(:parents)

代码 - https://github.com/shhavel/Whosebug-questions-39683691