4

I have an Ecto schema with embeds_many defined like this:

  schema "rounds" do
    embeds_many :growth_cycles, SomeModule.GrowthCycle, on_replace: :delete
  end

This translates to a jsonb field in PostgreSQL. The default value is an empty array - []. I'd like to write an Ecto query that returns only Rounds that have growth_cycles = [] (growth_cycles are not set/empty).

The simplest thing I tried was:

    from(r in Round, where: r.growth_cycles == [])

But this gives the following error:

** (Postgrex.Error) ERROR 42P18 (indeterminate_datatype) cannot determine type of empty array
...
hint: Explicitly cast to the desired type, for example ARRAY[]::integer[].

I've also tried:

    from(r in Round, where: length(r.growth_cycles) == 0)

But this gives an error saying that length isn't a valid query expression.

I see references to using fragments to drop down to raw PostgreSQL, but I'm not sure how to do this.

1 Answer 1

8

You can try using fragment/1 to interject raw SQL into your queries.

In this case, something like

(from r in Round, where: fragment("? = '{}'", r.growth_cycles)) |> Repo.all

should work

From the documentation:

It is not possible to represent all possible database queries using Ecto's query syntax. When such is required, it is possible to use fragments to send any expression to the database:

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.