jonbirke0927

jonbirke0927

Hello everyone,

My team and I are looking for perspectives on best-practices when defining associations in Ecto. Currently, we are using a Postgres database, and have defined a number of schemas in Ecto, some of which have associations. Our current pattern has been to use the Ecto.Query Macro API to define queries. When performing joins across tables / schemas, we don’t use our defined associations, and instead elect to join using the table name and an :on query expression.

Our questions are:

  • Since we are not using associations in our queries, should we eliminate the association definitions altogether?
  • Is there a benefit to keeping the unused association definitions, perhaps as documentation of underlying foreign keys?
  • Is there added benefit to using the associations when defining Ecto queries?

Thanks in advance!

Showing Posts 1 to 4

al2o3cr

al2o3cr

Offhand, here’s a few:

  • filtering with the where option
  • composing associations with the through option
  • Repo.preload etc

Counter-question: what’s the advantage to doing this? It seems mostly harmless - foreign keys don’t change names very much, reducing the risk of duplication - but it’s still repeating things that don’t need to be repeated…

thomasbrus

thomasbrus

This one is quite handy as well: Ecto.assoc

stefanchrobot

stefanchrobot

I find associations useful when preloading data and doing joins:

defmodule Account do
  schema do
    has_many :users, User
  end
end

defmodule User do
  schema do
    belongs_to :account, Account
  end
end

and then:

user = Repo.get(User, 1) |> Repo.preload(:account)

or

from user in User,
  join: account in assoc(user, :account),
  where: account.foo = ...
c4710n

c4710n

  • Answer 1: Yes. But I prefer using them.
  • Answer 2: Yes. I think it’s better to maintain association at schema level. Generally, migrations are broken code snippets, they can’t give you a panoramic view.
  • Answer 3: Yes. Read more in following content.

Suppose A has many B:

  • When you just want to get B, use Ecto.assoc.
  • When you want A and related B, use Ecto.preload or Ecto.Query.preload.
  • When :join is required, try assoc which make use of the associations defined in schema. Then, generally, you don’t need to use :on.

If you don’t define associations at schema level, you can’t use all of these good stuff.

— All posts loaded —

Where Next? Top

Trending in Discussions Top

AstonJ
As the title says, please share what you’ve been up to with Elixir. Whether that’s been learning it, looking into it, making stuff with i...
2977 94579 915
New
cblavier
Hey there, It’s been more than a year since we started using LiveView as our main UI library and building a whole library of UI componen...
New
caslu
I want to open this thread for you all to discuss and help those who really like Ash but are still hesitant to use it in a real project. ...
New
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
marciol
It would be helpful to have a list of companies worldwide that hire engineers without prior experience in Elixir. Often, it can be quite ...
New
durvia
Anyone running long-lived stateful processes on BEAM? We’re building an AI agent runtime and would love to compare notes. We’re a small ...
New
AstonJ
This might be a bit disturbing for some but it’s happening - computers running on living human neurons. They’ve made them smart enough t...
New

Other Trending Topics Top

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
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
webofbits
Aludel - LLM Evaluation Workbench Aludel is an embeddable Phoenix LiveView dashboard for evaluating and comparing LLM prompts across mult...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews