2016-07-15 10 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

私は考えることができる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 
    

(未テストコードはすべて、あなたがいずれかを見つけた場合、構文やその他のエラーを指摘してください)

関連する問題