Adrian Grzywaczewski
Adrian Grzywaczewski

Reputation: 888

has_many :through and join table in Rails

I would like to implement properly database and associated models for my application.

I have two models: user and location. I would like them to be joined by a table due to the fact that I need to keep historic data about the association between these two entities.

Therefore, I created a join table called user_locations in addition to the foreign keys of location_id and user_id I have two additional fields which I need.

So far so good.

A new requirement has emerged and I need my location to be polymorphic. I don't know how to set up my models properly to store to be able to have that joined table and a polymorphic association.

Here is what I came up with so far:

user.rb

class User < ApplicationRecord

  has_many :locations, through: :user_locations, as: :locationable, source_type: 'User'
  has_many :user_locations
end

location.rb

class Location < ApplicationRecord
  belongs_to :locationable, polymorphic: true
  has_many :users
end

user_location.rb

class UserLocation < ApplicationRecord
  belongs_to :user
  belongs_to :location

  validates_presence_of :user
  validates_presence_of :location

end

Upvotes: 0

Views: 127

Answers (1)

sevensidedmarble
sevensidedmarble

Reputation: 683

I found a very good tutorial/article that I think can help you here.

It would entail you doing something like:

class User < ApplicationRecord
  has_many :locations
  has_many :model_ones, through: :locations, source: :locationable, source_type: 'ModelOne'
  has_many :model_twos, through: :locations, source: :locationable, source_type: 'ModelTwo'

And:

class Location < ApplicationRecord
  belongs_to :locationable, polymorphic: true
  belongs_to :user
end

Where ModelOne and ModelTwo are filled in with the models you need obviously.

Upvotes: 1

Related Questions