Polymorphic Associations?

Hey all - I'm coming to drizzle-orm + SvelteKit from the Rails world. I want to have polymorphic associations, as documented here: https://guides.rubyonrails.org/association_basics.html#polymorphic-associations This is what I have in my schema.ts:
Ruby on Rails Guides
Active Record Associations — Ruby on Rails Guides
Active Record AssociationsThis guide covers the association features of Active Record.After reading this guide, you will know: How to declare associations between Active Record models. How to understand the various types of Active Record associations. How to use the methods added to your models by creating associations.
No description
20 Replies
rphlmr ⚡
rphlmr ⚡16mo ago
Hello, You should look at Relational queries: https://orm.drizzle.team/docs/rqb. I think this is what fits the must with what you want.
hacktographer
hacktographerOP16mo ago
Hello @Raphaël M (@rphlmr) ⚡ - thanks for the tip. So with the polymorphic relationship, I have 2 columns which combine to create a relationship between different tables. In my case, I have contextType and contextId - the contextType would define a relationship between membershipsTable and some other table, while contextType would tell me which row from the table referenced by contextType I should retrieve. In this example, a User might have a membership in both the StaffGroups and InsuredGroups tables, and we use membershipsTable.contextType to say one relationship is with StaffGroups and the other is with InsuredGroups. Two different rows in the same table, both with the same userId but with the contextId value referencing the id field of either the staffGroupsTable or insuredGroupsTable. The documentation for Relational Queries appears to have the table hard-coded. Maybe I could make that dynamic instead somehow?
rphlmr ⚡
rphlmr ⚡16mo ago
ok I see now. The relational api is to create a prisma like api when 2 tables are joined
hacktographer
hacktographerOP16mo ago
Right - but it might be multiple tables. A "user" could have a "membership" to multiple types of "groups". Staff, Insured Members, Affiliate Marketers, Service Providers, etc.
rphlmr ⚡
rphlmr ⚡16mo ago
you mean, having x foreign keys to tables?
hacktographer
hacktographerOP16mo ago
It's ok to not have foreign keys, I'm just looking for some syntactical sugar so I can get a list of a user's memberships to different groups
hacktographer
hacktographerOP16mo ago
for future reference, here's the github discussion about this topic for Prisma: https://github.com/prisma/prisma/issues/1644
GitHub
Support for Polymorphic Associations · Issue #1644 · prisma/prisma
I have the following schema: model Post { id String @default(cuid()) @id } model Comment { id String @default(cuid()) @id } model Vote { id String @default(cuid()) @id item Post | Comment } I'd...
rphlmr ⚡
rphlmr ⚡16mo ago
Ah yes it reminds me something i use a similar pattern like you but not that deep, for a cms I'm building. I have a table pubs with a type (enum like, but a string literal), an id col, user_id col, and common columns. Then I have as many tables as I have types. 🥶 A sort of inheritence pattern
hacktographer
hacktographerOP16mo ago
freeCodeCamp.org
How to Use Polymorphic Associations in Ruby on Rails
Polymorphic association in Ruby on Rails refers to the type of active record association. From the Rails Guide [https://guides.rubyonrails.org/association_basics.html#polymorphic-associations] , it allows a single model to belong to more than one other model on a single association. This tutorial assumes that you have some knowledge of a few ass...
hacktographer
hacktographerOP16mo ago
I think it's a common pattern, and I'd like to have some nice syntax for it -- and before I start trying to implement something on my own I'd like to be sure that the feature doesn't already exist in Drizzle ORM.
rphlmr ⚡
rphlmr ⚡16mo ago
my implementation results in many joins.
.leftJoin(PubPost, eq(PubPost.id, ClubPub.id))
.leftJoin(PubEvent, eq(PubEvent.id, ClubPub.id))
...
.leftJoin(PubPost, eq(PubPost.id, ClubPub.id))
.leftJoin(PubEvent, eq(PubEvent.id, ClubPub.id))
...
that I consolidate next in my code with a rule that said that if the 'reference type is x' then the join's result for this table can't be null. I don't think it will exist in core Drizzle api
hacktographer
hacktographerOP16mo ago
ahh ok I see. This is clear enough, and solves the problem Since this is such a common pattern, it might be worth adding to the official documentation. IMO it's not necessary that something like this is built-in to the tool, as long as the effect can be achieved.
rphlmr ⚡
rphlmr ⚡16mo ago
Sadly I can't share you the whole picture, but you got it 😄
hacktographer
hacktographerOP16mo ago
yeah that's nice -- I'll try with this style. Thank you so much!
rphlmr ⚡
rphlmr ⚡16mo ago
We need a shadcn for Drizzle haha Sharing code that others can copy paste as a base
hacktographer
hacktographerOP16mo ago
Dear Future Reader: Here is a stackoverflow answer that gives an example of how to achieve this pattern using only SQL: https://stackoverflow.com/a/2333543
Stack Overflow
SQL Conditional / Case Joining / Polymorphic Associations?
I'm trying to implement something similar to Ruby on Rails' polymorphic relationships. I have the following three tables : Events Users Organisations An event can be owner by either a user or an
dion
dion15mo ago
Hey! Still kind of confused as to how you create a polymorphic association in drizzle. Could you be kind enough to provide some code on your implementation? (i.e. changes you made to your schema.ts) That owuld help me alot. @hacktographer
CanRau
CanRau14mo ago
also trying to figure out how to get my schema with multiple polymorphic tables going with drizzle 🤔 also found https://github.com/drizzle-team/drizzle-orm/issues/1051
GitHub
[FEATURE]: Support Polymorphic Association · Issue #1051 · drizzle-...
Describe what you want I'm looking for a Typesafe ORM that support for polymorphic associations. To give a concrete example: I have a Comment model. I need this model to be associated with both...
Angelelz
Angelelz14mo ago
I just added a comment on that issue on how this can be achieved. I tested locally and the results are very promising
Want results from more Discord servers?
Add your server