2017-10-23 8 views
1

Ecto embeds_manyを試してみると、埋め込みフィールドの一部のデータをクエリする必要があるまでうまくいきます。Ecto embeds_manyアソシエーションのクエリ

は、だから私は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 

製品を作成した後、私はPostgresのテーブルでは、このようなもので終わる

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"}')が、整数の配列に変換: :私のようなものだった望んだ何malformed array literal: "[{"id": "dress"}]"

を取得し、 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("? -> 'id' = ?", p.categories, "rochie")しかし、それがうまくいくかどうかはわかりません。

答えて

2

jsonb[]なので、jsonという平文ではないため、@>という演算子は直接使用できません。あなたがやりたいANY<@を使用することができます。

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

これは、カテゴリ配列内の各カテゴリの'{"id": "dress"}' <@ ?を実行し、それらのいずれかが一致する場合はtrueを返します。

~s|"a"|"\"a\""を書くだけでクリーンな方法である。)

+0

本当にありがとうございました!それは完全に動作します。もし私があなたにもう1つの質問をすることができたら、 '' id '["dress"、 "shirt"] 'のようなものを探す方法は何でしょうか 基本的に多くのカテゴリをチェックします。 – iacobSon

+0

任意の数のケースについては何の解決策も考えられません。ANYはRHSでのみ許可されています。固定数のケースでは、同じ述語を単に「OR」することができます。 ( "?<@ ANY(?)"、〜s | {@ "}"、 " "id": "shirt"} |、p.categories) '。 – Dogbert

+0

はい、 'または'は良い解決策のように見えます。あなたの助けをもう一度ありがとう。 – iacobSon

関連する問題