Ecto embeds_many
を試してみると、埋め込みフィールドの一部のデータをクエリする必要があるまでうまくいきます。Ecto embeds_manyアソシエーションのクエリ
は、だから私はembeds_many
categories
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")
しかし、それがうまくいくかどうかはわかりません。
本当にありがとうございました!それは完全に動作します。もし私があなたにもう1つの質問をすることができたら、 '' id '["dress"、 "shirt"] 'のようなものを探す方法は何でしょうか 基本的に多くのカテゴリをチェックします。 – iacobSon
任意の数のケースについては何の解決策も考えられません。ANYはRHSでのみ許可されています。固定数のケースでは、同じ述語を単に「OR」することができます。 ( "?<@ ANY(?)"、〜s | {@ "}"、 " "id": "shirt"} |、p.categories) '。 – Dogbert
はい、 'または'は良い解決策のように見えます。あなたの助けをもう一度ありがとう。 – iacobSon