2017-06-18 45 views
0

我有兩個具有has_many關係的模式。 帖子:Ecto:提供給inputs_for的關聯值具有不同的順序

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 

在PostController中進行編輯操作我與相關注釋加載後:

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 %> 

問題在於,當我打開帖子編輯表單並添加了一些備註時,它按照與添加的順序不同的順序顯示備註,看起來Ecto預先關聯了不關注訂單的相關備註。有沒有簡單的方法讓Ecto按照添加順序保存相關模型?

回答

1

你可以通過查詢來Repo.preload做到這一點:

notes = from(n in MyProject.Blog.Note, order_by: n.inserted_at) 
post = Repo.get!(Post, id) |> Repo.preload(notes: notes) 

這將加載notes通過inserted_at升序排列。

+0

謝謝,它很優雅。很高興看到有繼續使用預加載功能的方式。 – AndreyKo

相關問題