특정 변경 집합 필드를 ecto : map 필드로 캐스팅

S1r 랜슬롯

다음과 같은 변경 세트가 있습니다.

%{
  creator_id: "4",
  name: "a test with GraphQL",
  place_id: "13",
  entree_id: "8",
  base: "wheat",
  type: "food"
}

내 ecto 스키마는 다음과 같습니다.

schema "items" do
  field :type, :string
  field :name, :string
  field :data, :map

  belongs_to :creator, Name.SubName.Creators
  belongs_to :place,   Name.SubName.Places
  belongs_to :entree,  Name.SubName.Entrees

  timestamps()
end

당신이 볼 수 있듯이 base체외 스키마에있는 필드 아니다, 나는 캐스트하려는 basedata그것이이되도록 필드 map유형, 즉 : {"base":"wheat"}. 여기서는 단일 테이블 상속을 사용하고 있습니다.

items테이블에 레코드를 추가하려고 합니다. 지금 테이블에서 읽을 때 data필드를 typebase필드 를 포함 하는 포함 된 스키마 (에 따라 다름)로 캐스팅합니다 . 내가 고생하는 곳은이 필드를 데이터베이스로 되 돌리는 것입니다.

나는 비슷한 것을 사용해 Ecto.Changeset.cast(params[:base], Map.keys(%{data: :map}))보았지만 분명히 유효한지도가 아닌 값을 얻었습니다. 또한 이것은 각각을 나타내는 다른 포함 된 스키마와 연결된 모든 고유 필드를 지정하는 것이 어려울 것 type입니다.

embeds_oneembeds_many때문에이 상황에 적용되지 않습니다 data체외 필드는 다른 포함 된 스키마 유형을 나타냅니다. 따라서이 경우 내 질문은 임베디드 스키마 사용에 관한 것이 아니라 a에서 특정 필드를 선택 changeset하여 map. 내 절반은 각각에 대해 별도의 테이블을 만들어야한다고 생각 type하면 걱정할 필요가 없습니다.

Sheharyar

다음을 사용할 수 있습니다 Map.split/2.

@required_fields [:name, :type, :creator_id, :place_id, :entree_id]
@all_fields [:data | @required_fields]

def changeset(struct, params) do
  {allowed, others} = Map.split(params, @required_fields)
  params = Map.put(allowed, :data, others)

  struct
  |> cast(params, @all_fields)
  |> # ...
end

여기서 주목해야 할 중요한 점은이 예제는 아톰 키가있는 맵에서만 작동한다는 것입니다. 문자열과 아톰 키를 모두 사용하려면 약간 수정해야합니다. 에 대한 기본값으로 빈지도를 지정하는 것도 고려할 수 있습니다 :data.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

특정 열 집합의 awk 또는 sed로 필드 구분 기호 변경

여러 텍스트 필드가있는 ListView의 특정 필드로 포커스를 변경하는 방법

Ecto : 파일 업로드 유효성 검사를 위해 % Plug.Upload를 가상 필드로 캐스팅

기본 Ecto 필드 이름과 다른 필드 이름으로 Absinthe 스키마를 설정하려면 어떻게해야합니까?

유니온 필드로 캐스팅하면 변환 경고가 발생합니다.

필수 필드가 누락 된 모델이 저장되지 않도록 Ecto 변경 세트를 어떻게 설정합니까?

uint32 변수를 비트 필드로 캐스팅-정의되지 않은 동작?

Javafx는 텍스트 필드 변경을 감지하고 캐럿 위치를 결정합니다.

jq를 선택하여 특정 필드 값을 변경합니다.

특정 필드가 변경된 경우 필수 필드가 모두 필요하지 않아야 합니다.

정수 필드를 타임 스탬프로 캐스팅 한 다음 날짜로 캐스팅

텍스트 필드를 텍스트 영역 필드로 변경

일부 변수의 합계를 포인터로 캐스팅 한 다음 다시 정수로 캐스팅

메서드 내부에 개체 유형 변수를 전달하고 if 문 내부의 특정 클래스로 캐스팅합니다.

Django에서 항상 특정 필드를 VARCHAR로 캐스팅하는 방법이 있습니까?

필드 변경시 특정 텍스트 출력

Ecto 사용자 정의 유형 : 모델의 필드를 특정 유형으로 표현하려면 어떻게합니까?

JOLT 변환은 특정 필드를 제거합니다.

필드별로 요소 집합 정렬

장고 데이터베이스 필드를 정수에서 CharField로 변경

그리드 콤보 박스 및 텍스트 필드 편집기-emptyText를 동적으로 변경하고 필드를 지 웁니다.

상속은 Unsafe 클래스로 얻은 필드의 오프셋을 변경합니까? 아니면 특정 가상 머신 구현에 의존합니까?

Rails는 특정 필드 값이 변경된 경우에만 유효성 검사를 업데이트합니다.

Spring은 mongodb의 정렬 필드 순서를 변경합니다.

변수 중첩이있는 중첩 필드 (또는 특정 json 필드에 대해)로 집계하는 ElasticSearch

드롭 다운 선택 필드가 특정 값으로 설정된 경우 텍스트 입력 필드를 지우시겠습니까?

특정 배열 값 필드를 집계로 반환

날짜 필드를 특정 형식으로 변경하는 방법

클릭 한 특정 입력 필드를 반영하여 부트 스트랩 모달 변경을 수행하려면 어떻게해야합니까?

TOP 리스트

뜨겁다태그

보관