2017-10-23 5 views
1

Ecto embeds_many을 실험 해 보았습니다. 포함 된 필드의 일부 데이터를 쿼리해야합니다.Ecto에서의 쿼리 embeds_many associations

그래서 나는 embeds_manycategories

schema "products" do 
    field :code, :string, null: false 

    embeds_many :categories, Category, 
    on_replace: :delete, 
    primary_key: {:id, :binary_id, autogenerate: false} 
    do 
    field :name, :string 
    end 
end 

def create_changeset(%Product{} = product, attrs) do 
    product 
    |> cast(attrs, [:code]) 
    |> cast_embed(:categories, with: &attributes_changeset/2) 
end 

def attributes_changeset(%{} = product_attribute, attrs) do 
    product_attribute 
    |> cast(attrs, [:id, :name]) 
end 

제품을 만든 후 나는 포스트 그레스 테이블에서이 같은 끝낼

ID 코드 범주

1 11  {"{\"id\": \"dress\", \"name\": \"Dress\"}, 
      "{\"id\": \"shirt\", \"name\": \"Shirt\"}} 
2 22  {"{\"id\": \"dress\", \"name\": \"Dress\"}} 

그래서 product 같은 뭔가를 이제 products을 쿼리하고 싶습니다. id == "dress"은 물론이고 위의 2 가지 결과를 얻으려면

나는 이런 식으로 실험 한 : q = from p in Product, where: fragment("? @> ?", p.categories, '{"id": "dress"}')하지만 정수의 배열 변환 : operator does not exist: jsonb[] @> integer[] ... WHERE (p0."categories" @> ARRAY[123,34,105,100,34,58,32,34,100,114,101,115,115,34,125])

또는 : 을 : q = from p in Product, where: fragment("? @> ?", p.categories, "[{\"id\": \"dress\"}]"), 나는 바랐다 무엇 malformed array literal: "[{"id": "dress"}]"

얻는 같은 q = from p in Product, where: fragment("? -> 'id' = ?", p.categories, "rochie")하지만 작동 여부는 확실하지 않습니다.

답변

2

여기서 categoriesjsonb[]이므로 일반 json이 아니므로 @> 연산자는 직접 작동하지 않습니다.

where: fragment("? <@ ANY(?)", ~s|{"id": "dress"}|, p.categories) 

이 범주 배열의 각 범주에 대한 '{"id": "dress"}' <@ ?을 실행하고 그 중 하나가 일치하는 경우 true를 반환 : 당신은 당신이 원하는 것을 할 ANY<@를 사용할 수 있습니다.

(~s|"a"|"\"a\""를 작성 단지 청소기 방법입니다.)

+0

정말 고마워요! 그것은 완벽하게 작동합니다. 제가 질문 하나 더 드릴 수 있다면,''id "["dress ","shirt "]' 과 같은 것을 찾는 방법은 무엇이 있을까요? 기본적으로 많은 카테고리를 확인하는 것입니다. – iacobSon

+0

임의의 수의 경우에 대한 솔루션을 생각할 수 없습니다. ANY는 RHS에서만 허용됩니다. 고정 된 수의 사례의 경우 동일한 조건자를 'OR'할 수 있습니다 (예 : ("? <@ ANY (?)", ~ s | { "id": "dress"} |, p.categories) 또는 조각 "id": "shirt"} |, p.categories)'. – Dogbert

+0

예, '또는'은 좋은 해결책처럼 보입니다. 도와 주셔서 다시 한번 감사드립니다. – iacobSon