Besides regular schemas with universal foreign keys (Pointable), Needle provides Virtual for schemas that don’t have any fields on their own, and Mixin for storing common fields that can be re-used by multiple Pointables or Virtuals (eg. if you have multiple types that all have a name/description/body, they can share those and optionally the associated changesets and other logic).

#ecto#myElixirStatus #elixir

5/6

Needle also comes with two other homegrown libraries: needle_ulid which provides a ULID datatype for Ecto (using ex_ulid) and related helpers, and exto which enables extending Ecto schema definitions in config (especially useful for adding Mixin associations to different schemas)…
---
📣 🏴‍☠️ Camp! expedition: We have some open bounties to improve bonfire performance :
Read more: https://indieweb.social/@bonfire/112943944096656953
Repository: https://github.com/bonfire-networks/bounties
#ecto#myElixirStatus #elixir
6/6
But what if you don’t just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add liked_video_id, liked_image_id, ad infinitum?

We needed the flexibility to have a foreign key that can reference any referenceable object. We call our system Needle.

#ecto#myElixirStatus #elixir
4/6

Besides regular schemas with universal foreign keys (Pointable), Needle provides Virtual for schemas that don’t have any fields on their own, and Mixin for storing common fields that can be re-used by multiple Pointables or Virtuals (eg. if you have multiple types that all have a name/description/body, they can share those and optionally the associated changesets and other logic).

#ecto#myElixirStatus #elixir

5/6

A simple example would be a blogging app, which might have a post table with author field that references the user table.

A social network, by contrast, usually requires a graph of objects, meaning objects need to be able to refer to other objects by their ID without knowing their type.

A simple example would be likes, you might have a likes table with liked_post_id field that references the post table.

#ecto#myElixirStatus #elixir
3/6

But what if you don’t just have posts that can be liked, but also videos, images, polls, etc, each with their own table, but probably do not want to have to add liked_video_id, liked_image_id, ad infinitum?

We needed the flexibility to have a foreign key that can reference any referenceable object. We call our system Needle.

#ecto#myElixirStatus #elixir
4/6

Needle is one of several libraries we're releasing. Beyond creating extensions for Bonfire (like misinformation labeling or metadata extraction for scientific publications), we often need to build foundational functionality. We package these into reusable libraries for the wider Elixir ecosystem.

When using a relational DB (such an Ecto schema with a Postgres table), usually a foreign key field has to be pre-defined with a reference pointing to a specific field in a specific table.

2/6

A simple example would be a blogging app, which might have a post table with author field that references the user table.

A social network, by contrast, usually requires a graph of objects, meaning objects need to be able to refer to other objects by their ID without knowing their type.

A simple example would be likes, you might have a likes table with liked_post_id field that references the post table.

#ecto#myElixirStatus #elixir
3/6

Needle is an #elixir library that we have developed to provide universal foreign keys, shared data fields, and virtual & configurable schemas for Ecto.

🔗 Read the docs: https://hexdocs.pm/needle/readme.html
💬 Join the discussion on Elixir Forum: https://elixirforum.com/t/needle-universal-foreign-keys-shared-data-fields-virtual-and-configurable-schemas-for-ecto/65644

#ecto#myElixirStatus
1/6