たとえば、配列sizes
のフィールドを持つモデルがあります(たとえば、sizes: ['S', 'M', 'L']
)。私が達成したい、APIを構築することは、ユーザーがサイズに基づいてそれらのモデルをフィルタリングできるようにすることです。だから、このパスにGET
要求:Ectoの 'model.fieldには配列が含まれています'の操作方法は?
.../products?sizes=['S','M']
は、指定された配列は、そのsizes
フィールドの部分配列であるすべての製品を返す必要があります。だから私は正確なマッチを望んでいないし、必要もないが、ユーザーが上記のようにフィルタリングできるようにしたい。 Phoenix APIでこれを達成するにはどうすればいいですか?
特定の値(where: this in that
)を含むものをフィルタリングすることしかできませんでしたが、配列を渡してその配列がそのモデルフィールドに含まれているかどうかを確認したい場合、少し失われます。
ご協力いただきありがとうございます。追加情報が必要な場合はお知らせください。
EDIT
私はfragment("? @> ?::varchar[]", p.sizes, ^params["sizes'])
を使用しようとしていますし、それが動作しますが、私は既存のものの上に[color: "red"]
のような任意の単純なフィルタを追加した場合、それが失敗したが、これは私がフィルターのセットを作成することができないことを意味しますその後、これは現在動作しません... and ^filters
filters = Ecto.Changeset.cast(%Product{}, params, [], [:color])
|> Map.fetch!(:changes)
|> Map.to_list
# Do I need to actually do this check like this ? (It fails otherwise)
sizes = if is_nil(params["sizes"]) do [] else params["sizes"] end
products_query = from(
p in Product,
where: fragment("? @> ?::varchar[]", p.sizes, ^sizes) and
^filters
)
ようwhere
句に追加します。
この回答はhttp://stackoverflow.com/questions/36814260/how-to-build-where-役に立つかもしれませんin-a-array-clause-with-ecto –
ありがとう@HarrisonLucas私はすでにその答えを見ましたが、私はすでにその方法を試していたので、私の問題は解決しません。 – G4bri3l