2017-12-29 45 views
0

내 블로그 앱에는 다른 사람들의 게시물을 복사하여 자신의 것으로 호스트 할 수있는 기능이 있습니다.연애 편지에 연관성이있는 항목 복제

Post은 소유자와 연결되어 있습니다.

schema "posts" do 
    field :title, :string 
    field :content, :string 

    belongs_to :owner, MyApp.Accounts.User, foreign_key: :owner_id 
    end 
내가 ID로 Post의 사본을 얻을 ID와 OWNER_ID 필드를 제거하려는

가, 새 소유자 ID를 주조 한 다음 삽입합니다.

resolve fn (%{post_id: post_id, new_owner_id: new_owner_id}, _info) -> 
    Repo.get!(Post, post_id) 
    |> Map.delete(:id) 
    |> Map.delete(:owner_id) 
    |> Post.changeset(%{owner_id: new_owner_id}) 
    |> Repo.insert! 
end 

하지만 내가 할 때이 오류가 얻을 :

Request: POST /api 
** (exit) an exception was raised: 
    ** (RuntimeError) attempting to cast or change association `owner` from `MyApp.Content.List` that was not loaded. Please preload your associations before manipulating them through changesets 

이 복사본을 할 수있는 올바른 방법은 무엇입니까? 그것은 분명 오류 메시지에 언급 한 바와 같이

답변

1

:

Please preload your associations before manipulating them through changesets

resolve fn (%{post_id: post_id, new_owner_id: new_owner_id}, _info) -> 
    Post 
    |> Repo.preload(:owner) # ⇐ this 
    |> Repo.get!(post_id) 
    |> Map.delete(:id) 
    |> Map.delete(:owner_id) 
    |> Post.changeset(%{owner_id: new_owner_id}) 
    |> Repo.insert! 
end 

(!) 참고 : 나는 믿고, 당신이 잘못하고있다. 더 나은 디자인은 "인용 된"게시물의 향후 변경 가능성을 반영하는 것입니다. 콘텐츠를 복사하는 대신 사용자와 게시물간에 새로운 다 대다 관계 (예 : "복사본."

참조로 복사하면 값으로 복사하는 것보다 낫습니다.DRY principle은 그 중 극히 소수에 불과합니다. 항상입니다.

+0

이 상황에서 데이터의 분기/발산이 바람직합니다. 새로 복사 한 게시물의 변경 사항은 새 소유자의 사본에만 있습니다. 이러한 요구 사항을 감안할 때 여전히 최선의 방법인가? –

+1

우리가 이야기하고있는 변화의 유형에 따라 크게 달라집니다. 서문, 주석, 강조 표시를 추가하는 경우에는 그렇습니다. 그것이 텍스트 교정에 관한 것이라면 나는 표절을 고맙게 생각합니다. 이것이 바로 표절이 무엇인지에 대한 것입니다. 그래서 나는 확실히 원래 게시물에 대한 참조와 주변에 몇 가지 "장식"을 고집 할 것입니다. _ 명확하게 구분됩니다. 아마도 하나의 속성을이 다 대일 테이블에 "고정"과 같은 수정 사항을 추가하여 원래 게시물 (게시물의 버전 저장을 의미 함) 또는 기타 사항에 따라 수정하지 못하게 할 수 있습니다. 그렇게. – mudasobwa

+1

어쨌든, 지금 당장은'Repo.preload'로 계속 진행할 수 있습니다. 나중에 나에게 감사를 표합니다. – mudasobwa