Ecto:提供给 inputs_for 的关联值有不同的顺序
Ecto: associated values provided to inputs_for have different order
我有两个具有 has_many 关系的模式。
Post:
schema "blog_posts" do
field :body, :string
has_many :notes, MyProject.Blog.Note, foreign_key: :blog_post_id
timestamps()
end
并注意:
schema "blog_notes" do
field :title, :string
belongs_to :post, MyProject.Blog.Post, foreign_key: :blog_post_id
timestamps()
end
在 Post 编辑操作控制器中,我加载 post 和相关注释:
def edit(conn, %{"id" => id}) do
post = Repo.get!(Post, id) |> Repo.preload(:notes)
IO.inspect post
changeset = Blog.change_post(post)
render(conn, "edit.html", post: post, changeset: changeset)
end
表单模板如下所示:
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :body, class: "control-label" %>
<%= textarea f, :body, class: "form-control" %>
<%= error_tag f, :body %>
</div>
<%= inputs_for f, :tags, fn fa -> %>
<div class="form-group">
<%= label fa, :title, class: "control-label" %>
<%= text_input fa, :title, class: "form-control" %>
<%= error_tag fa, :title %>
</div>
<%= end %>
<%= end %>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>
问题是,当我打开添加了一些注释的 post 编辑表单时,它显示注释的顺序与添加时的顺序不同,似乎 Ecto 预加载了相关注释而不关心顺序。有没有简单的方法让 Ecto 按照添加的顺序获取保存的关联模型?
您可以将查询传递给 Repo.preload
来执行此操作:
notes = from(n in MyProject.Blog.Note, order_by: n.inserted_at)
post = Repo.get!(Post, id) |> Repo.preload(notes: notes)
这将按 inserted_at
升序加载 notes
。
我有两个具有 has_many 关系的模式。 Post:
schema "blog_posts" do
field :body, :string
has_many :notes, MyProject.Blog.Note, foreign_key: :blog_post_id
timestamps()
end
并注意:
schema "blog_notes" do
field :title, :string
belongs_to :post, MyProject.Blog.Post, foreign_key: :blog_post_id
timestamps()
end
在 Post 编辑操作控制器中,我加载 post 和相关注释:
def edit(conn, %{"id" => id}) do
post = Repo.get!(Post, id) |> Repo.preload(:notes)
IO.inspect post
changeset = Blog.change_post(post)
render(conn, "edit.html", post: post, changeset: changeset)
end
表单模板如下所示:
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :body, class: "control-label" %>
<%= textarea f, :body, class: "form-control" %>
<%= error_tag f, :body %>
</div>
<%= inputs_for f, :tags, fn fa -> %>
<div class="form-group">
<%= label fa, :title, class: "control-label" %>
<%= text_input fa, :title, class: "form-control" %>
<%= error_tag fa, :title %>
</div>
<%= end %>
<%= end %>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>
问题是,当我打开添加了一些注释的 post 编辑表单时,它显示注释的顺序与添加时的顺序不同,似乎 Ecto 预加载了相关注释而不关心顺序。有没有简单的方法让 Ecto 按照添加的顺序获取保存的关联模型?
您可以将查询传递给 Repo.preload
来执行此操作:
notes = from(n in MyProject.Blog.Note, order_by: n.inserted_at)
post = Repo.get!(Post, id) |> Repo.preload(notes: notes)
这将按 inserted_at
升序加载 notes
。