I have two tables in my app which I am attempting to relate through a
join table. The Artist class which uses 'has_many through', works as
expected. However, the Event class using 'has_one through', brings back
nil.
class Artist < ActiveRecord::Base
has_many :artist_events, dependent: :destroy
has_many :events, through: :artist_events
end
class Event < ActiveRecord::Base
belongs_to :artist_event
has_one :artist, through: :artist_events
end
class ArtistEvent < ActiveRecord::Base
belongs_to :artist
belongs_to :event
end
In irb i get all events for an artist with "a.events" (where a =
Artist.first). But e.artist returns 'nil'. Whats strange is that
a.artist_event returns nill as well. However, when I run a 'find_by' on
the artist_event table and use e.id, the artist_event is returned.
I have tried changing the Event class to use has_one as opposed to
belongs_to, without effect.
What am I missing? Do I need to have an index in the schema?
I have not done this but I think it should be
has_one :artist_event # to match ArtistEvent belongs_to event
has_one :artist through: artist_event # note, singular artist_event
However, in this scenario I don't think you need the join table at
all, why not just have
Artist has_many events
Event belongs_to artist
Something hasn’t been copied correctly here, because this shouldn’t work - the through refers to an association (artist_events) that doesn’t exist on Event.
As noted elsewhere, belongs_to is likely not the right association to use here; it’s expecting an ‘artist_event_id’ column on the ‘events’ table.
You’ll also want to carefully consider if has_one is the right association as well. The table structure you’ve set up (Artist / ArtistEvent / Event) is a classic many-to-many relationship. If an Event can truly only have one artist, this structure is not needed. If an Event can have many artists, than a has_one isn’t correct.