2016-07-15 66 views
0

如何在Repo.insert之後使用自定義模型函數預加載所選數據?我不會在控制器中複製模型中的代碼。如何在插入後使用自定義預載功能?

在帖子型號:

def preload_all(query) do 
    tags = from(t in Tag, select: %{id: t.id, value: t.id}) 
    from b in query, preload: [:user, tags: ^tags] 
end 

在控制器:

case Repo.insert(changeset) do 
    {:ok, post} -> 
    # post = post |> Post.preload_all 
    post = Repo.preload(post, [:user, :tags]) 
end 

回答

2

有兩種方法我能想到的:

  1. 通在獲取後與id查詢= post.id

    case Repo.insert(changeset) do 
        {:ok, post} -> 
        post = Repo.one(Post.preload_all(from p in Post, where: p.id == ^post.id)) 
    end 
    

    請注意,這將執行多於一次的查詢。

  2. 提取預載參數不同的功能,並從控制器和模型都使用它:

    # Post Model 
    def preload_args do 
        tags = from(t in Tag, select: %{id: t.id, value: t.id}) 
        [:user, tags: tags] 
    end 
    
    def preload_all(query) do 
        from b in query, preload: ^preload_args 
    end 
    
    # Controller 
    case Repo.insert(changeset) do 
        {:ok, post} -> 
        post = Repo.preload(post, Post.preload_args) 
    end 
    

(所有測試的代碼,如果你發現任何請指出語法錯誤或其他錯誤)