2017-06-18 34 views
0

has_manyの関係を持つ2つのスキーマがあります。 ポスト:Ecto:inputs_forに関連付けられた値が異なる順序を持つ

schema "blog_posts" do 
    field :body, :string 
    has_many :notes, MyProject.Blog.Note, foreign_key: :blog_post_id 
    timestamps() 
    end 

と注意のPostControllerで

schema "blog_notes" do 
    field :title, :string 
    belongs_to :post, MyProject.Blog.Post, foreign_key: :blog_post_id 
    timestamps() 
    end 

編集アクションのための私は、関連するノートとポストをロード:

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) 

これは昇順でinserted_atnotesをロードします。

+0

ありがとう、とてもエレガントです。そのような場合にプリロード機能を使用し続ける方法があることを知りました。 – AndreyKo

関連する問題