在同一个 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_many
和 cast_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
中为 edit
和 update
操作预加载 :parents
:
student = Repo.get!(Student, id) |> Repo.preload(:parents)
我想在表格中显示一些相关数据。我有一个学生模式
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_many
和 cast_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
中为 edit
和 update
操作预加载 :parents
:
student = Repo.get!(Student, id) |> Repo.preload(:parents)