2016-12-21 6 views
1

たとえば、配列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句に追加します。

+0

この回答はhttp://stackoverflow.com/questions/36814260/how-to-build-where-役に立つかもしれませんin-a-array-clause-with-ecto –

+0

ありがとう@HarrisonLucas私はすでにその答えを見ましたが、私はすでにその方法を試していたので、私の問題は解決しません。 – G4bri3l

答えて

2

「アレイが含まれています」操作には、@>fragmentを使用する必要があります。あなたの2番目の質問については、andとチェーンwhere式に、あなただけの別のwhereを追加することができます。

products_query = from(
    p in Product, 
    where: fragment("? @> ?::varchar[]", p.sizes, ^sizes), 
    where: ^filters 
) 
+0

もちろん、シンプル= /、助けてくれてありがとう! – G4bri3l

関連する問題