bharani91

bharani91

I’ve been struggling to compose Ecto queries. I have 2 models - a Person model and a traits model like so -

Person -> has_many -> Traits
Trait -> belongs_to -> Person

The schema for Traits model is like this -

schema "person_attributes" do
    field :name, :string
    field :value, :string
    belongs_to :person, App.Person

    timestamps()
end

What I am trying to achieve is dynamically filter people based on certain traits. Eg: find only those people who have a trait called ‘plan’ with a value of ‘Business’.

I should also be able to add more trait-based filters based dynamically, eg: people who have trait with name == ‘plan’ and value == ‘business’ AND another trait with name == ‘medium’ and value == ‘mobile’.

(From the front-end ui, the user can choose to add more trait-based filters via a dropdown and this query should reflect that trait’s name & value.)

I think this is the query that I need. My only issue is that I am not able to generate it dynamically.

from s in Person,
    where: s.account_id == ^1 and s.state == ^"active",
    join: c in Trait, where: c.person_id == p.id,
    where: (c.name == ^"plan" and c.value == "pro") or (c.name == ^"creation_date", fragment("CAST(coalesce(?, '0') AS integer)", c.value) >= 1470216128)

Any help would be highly appreciated!
Thanks!

Showing Posts 1 to 1

nerdyworm

nerdyworm

def search(params) do
  query = from s in Person, where: s.account_id == 1

  query = if params.plan != "" do
      where(query, [p], p.name == ^params.plan)
    else
      query
    end
   # other logic for building the query
  query
end

And of course you can use the query variable to compose another like so

query = search(%{q: "search for q"})

query
|> where([p], p.person_id == ^id)
|> Repo.all

This was also a very helpful blog post covering the topic: https://blog.drewolson.org/composable-queries-ecto/

Let me know if this helps.

Cheer,
Benjamin

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
psy-q
I’m trying to set up Emacs with elixir-ls via lsp-mode and credo via Flycheck. This should mostly be preconfigured as Flycheck picks up c...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews