Multiple has_many associations, different name, same struct

I’ve got a Schema “Details” and a Schema “Buildables”. Inside of Details, I want it to have multiple associations (shown below) but they’re all different iterations of the same schema, Buildables. Is this possible or do I have to make a unique schema for each of these associations?

schema "details" do
    has_many :single_family_homes, Buildable
    has_many :multi_family_homes, Buildable
    has_many :apartments, Buildable
    has_many :micro_apartments, Buildable
    has_many :high_rises, Buildable
schema "buildable" do
    field :enabled, :boolean
    field :reason, {:array, :string}
    field :upgrades, :map
    belongs_to :details, MayorGame.City.Details

Hi @warronbebster and welcome to the forum.

I don’t think this can be done with has_many.
Update: It’s possible, see this answer of al2o3cr.

An alternative approach, don’t know if this would work for you: define functions in your context module for all the different types of buildables:

def single_family_homes(%Detail{id: id}} do
  Repo.all(from b in Buildable, where: b.detail_id == ^id and b.type == "single_family_home")

# ... etc for all types of houses

So now you can call MayorGame.City.single_family_homes(detail).

(PS: just assuming here that your context module is called City and there is a type attribute for Buildable)

Just checking if you’ve seen this guide! :blush: The use case seems to be a bit different but hopefully there’s some useful insight. Polymorphic associations with many to many — Ecto v3.6.1

The code shown in your post should certainly work, but it doesn’t include any distinction between the different kinds of Buildable. Assuming there is a type on Buildable as @zwippie did, you could filter the associations with where:

has_many :single_family_homes, Buildable, where: [type: "single_family_home"]

See also the note under “Important!” at the bottom of that section.

1 Like

Thanks @al2o3cr, I don’t know why I missed that where option! :man_facepalming: