2016-10-16 1 views
0

우리는 수작업으로 관계를 테스트하는 테스트를 많이하고 있습니다. 우리는 같은 것을 수행Elixir Phoenix에서 JSON-api 관계를 동적으로 생성합니다.

defp build_relationships(relationship_map, user) do 
    relationship_map |> Map.put(:user, %{data: %{id: user.id}}) 
end 

이 잘 작동을하지만 기록의 모든 종류의 (단지 사용자)을 채택하는 것이 유연하게하고 싶다. 참고로 userex-machina으로 생성되며 insert(:user)입니다.

전달되는 레코드의 type을 얻을 수있는 방법이 있습니까? "user"이라고하는 문자열을 얻을 수 있다면 String.to_atom(param)을 사용하고 Map.put에 전달할 수 있지만이를 수행하는 우아한 방법을 찾을 수 없습니다.

실제 질문은 user과 같은 레코드를 가져 와서 :user의 원자를 반환하는 것입니다.

도움을 주시면 감사하겠습니다.

iex(1)> %Post{}.__struct__.__schema__(:source) 
"posts" 

을하지만 일이 없기 때문에 :

답변

1

당신은 예를 들어, .__struct__.__schema__/1를 사용하여 체외 구조체에 대한 몇 가지 정보를 얻을 수있는 엑스 마키나 공장에 대한 스키마 1 매핑, 내가 생각할 수있는 3 개 가지 방법이있다 의 :

  1. 테이블의 이름과 같은 복수형을 사용하는 공장의 이름을 변경하고 이름을 가져 .__struct__.__schema__(:source)를 사용합니다. 이렇게하면 insert(:users)을 사용하여 한 명의 사용자를 삽입 할 때 공장 코드가 약간 이상하게 읽혀집니다.

  2. 여러 개의 테이블 이름을 단 하나의 이름으로 변환하려면 라이브러리를 사용해야합니다. "users""user"으로, "posts""post"으로 변환하는 것입니다.

  3. 스키마 <의 목록 유지 -이 (또는 당신도 별도의 함수에 매핑을 이동할 수 있습니다)처럼> 공장 이름 매핑을 :

    defp build_relationships(relationship_map, struct) do 
        mapping = %{MyApp.User => :user, MyApp.Post => :post} # add more here 
        relationship_map |> Map.put(mapping[struct.__struct__], %{data: %{id: struct.id}}) 
    end 
    
  4. 사용 Module.split/1을 모델의 이름을 가져 와 소문자 + 밑줄 이름으로 변환 Macro.underscore/1를 사용하고 사용 String.to_existing_atom :

    defp build_relationships(relationship_map, struct) do 
        name = struct.__struct__ |> Module.split |> List.last |> Macro.underscore |> String.to_existing_atom 
        relationship_map |> Map.put(name, %{data: %{id: struct.id}}) 
    end 
    

    당신은 예를 들어 모델로 중첩 된 모듈을 사용하는 경우이 제대로 작동하지 않습니다 MyApp.Something.User.

모든 모델은 같은 중첩 수준 또는 3에있는 경우 좀 더 명시 적으로 원한다면, 4를 선택합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 이 프로젝트에는 많은 기여자가 있기 때문에 세 번째를 시도하는 것을 주저합니다. 나중에 업데이트해야하는 도우미를 작성하고 싶지 않습니다. 나는 그것을 시험해 보았다. 그리고 그것은 잘 작동한다! 옵션 2를 사용할 수 있습니다. 도움에 감사드립니다! – sbatson5

+0

@ sbatson5 방금 추가 한 네 번째 옵션을 참조하십시오. 나는 당신의 사용에 더 나을 수있는 더 나은 방법을 생각했습니다. – Dogbert

+0

고마워요! 이것은 내가 필요한 것입니다. 궁금한 점이 있으시면 여기에서 구현되는 홍보를보실 수 있습니다 : https://github.com/code-corps/code-corps-api/pull/358/files – sbatson5

관련 문제