hackinghealth
hackinghealth

Reputation: 23

Rails join tables

I have the following models

User
Meeting
Participant

Particpant < User
Meeting belongs_to :user
Meeting has_many :participants

I have the following join table

create_table 'meetings_participants', :id => false do |t|
  t.column :meeting_id, :integer
  t.column :participant_id   , :integer
end

I want to add t.column :confirmed_at , :datetime so that I know when and if a user has confirmed that they are attending a meeting but I dont know the best way to do it.

How can I set confirmed_at? Since this is

Upvotes: 2

Views: 3908

Answers (2)

Larry K
Larry K

Reputation: 49104

Your plan is fine: just add :confirmed_at :datetime as a field in the meetings_participants join table.

You may want to reserve a null :confirmed_at to mean that they were invited to the meeting but never confirmed. And didn't attend? Can someone attend a meeting that they didn't confirm their attendance at?

I usually include the :id in join tables even though it is not really needed. There are a lot of rails assumptions about all tables having ids.

added

You should add a unique index on [:meeting_id, :participant_id] to your join table.

added

You can certainly have join tables represented by ActiveRecord models in Rails apps. Include an id field in the table to keep ActiveRecord happy. Example:

class MeetingsParticipant < ActiveRecord::Base
  # join table. Table name: meetings_participants

  belongs_to :meeting
  belongs_to :participant

  # field confirmed_at is nil for invited participants who have
  #                    not yet confirmed attendance

end

Upvotes: 4

Ben
Ben

Reputation: 13615

To do this, I think it is best to have a good look at the models you set up and do abit of refactoring. What you want is a user related to a meeting. I think the best way to get this relational model, is to introduce another model: participant this is a user related to a meeting. Your models would look like:

User
  has_many :participants
  has_many :meetings, through: :participants

Participant
  belongs_to :user
  belongs_to :meeting

Meeting
  has_many :participants
  has_many :users, through: :participants

Upvotes: 1

Related Questions